我最近读到mapPython 3 中的一个好处是它很懒.这意味着,做得更好
map(lambda x: x**2, range(10**100))
Run Code Online (Sandbox Code Playgroud)
而不是
[x**2 for x in range(10**100)]
Run Code Online (Sandbox Code Playgroud)
我很好奇的是,我如何能够使用这种懒惰.如果我生成地图对象,我怎么能访问结果操作/列表中的特定元素.在几乎每一个文档,map我所看到的,他们会做这样的事情print(map(...))或for i in map(...)其中(据我所知)放弃懒概念,因为它隐含映射到一个列表转换.
我想我正在寻找的是能够以类似的懒惰方式使用地图对象,就像range我可以做的那样,懒散x = range(10**100)地生成x[10000]而没有巨大的计算负荷.
如果这个概念不存在,那么map懒惰的好处是什么?如果你总是需要把它转换成一个非懒惰的对象,比如列表,为什么map懒惰呢?
我正在寻找一种在C中有一个函数的方法,它接受一个定义特定变量类型的字符串作为输入.然后,该函数返回该sizeof输入的结果,就好像该字符串被评估为一个类型一样.考虑下面的例子.
#include <stdint.h>
typedef struct my_struct {
int16_t var1;
int16_t var2;
int16_t var3;
} mystruct_t;
int main(int argc, char * argv[])
{
return sizeof(argv[1]); // THIS IS WRONG!!
}
Run Code Online (Sandbox Code Playgroud)
然后用户可以编译它并尝试调用./myprogram my_struct_t我希望my_struct_t在运行时在我的机器上返回实际C字节大小的位置.
我不确定的部分是显然这会得到存储在其中的(指向)字符串argv[1]的大小,而不是字符串定义的类型的大小.我怎样才能进行这种转换?这甚至可能吗?
我有一个数组,我想在一个已知的索引集合中替换其前面的值.举个例子,我的数组可能是
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
Run Code Online (Sandbox Code Playgroud)
并且要被先前值替换的值的索引可能是
y = [2, 3, 8];
Run Code Online (Sandbox Code Playgroud)
我希望这个替换从左到右发生,或者从头到尾发生.也就是说,索引2处的值应该被索引1处的值替换,之后索引3处的值将被索引2处的值替换.使用上面的数组的结果应该是
[1, 1, 1, 4, 5, 6, 7, 7, 9, 0]
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用明显的方法在Matlab中实现这一点,我的结果是
>> x(y) = x(y-1)
x =
1 1 2 4 5 6 7 7 9 0
Run Code Online (Sandbox Code Playgroud)
希望您可以看到此操作从右到左执行,索引3处的值替换为索引2处的值,然后将2替换为1.
我的问题是:有没有办法以一种简单的方式实现我想要的结果,没有蛮力循环阵列或做一些耗时的事情,比如反转阵列?
给定2D点p,我试图计算该点与功能曲线之间的最小距离,即找到曲线上的点,该点给出最小距离p,然后计算该距离.我正在使用的示例函数是
f(x) = 2*sin(x)
Run Code Online (Sandbox Code Playgroud)
我的距离函数用于某个点p和提供的函数之间的距离
def dist(p, x, func):
x = np.append(x, func(x))
return sum([[i - j]**2 for i,j in zip(x,p)])
Run Code Online (Sandbox Code Playgroud)
它作为输入,点p,x函数上的位置和函数句柄func.注意这是一个平方欧几里德距离(因为欧几里德空间中的最小化与平方欧几里德空间中的最小化相同).
这个的关键部分是我希望能够为我的函数提供边界,所以我真的找到了与函数段最近的距离.对于这个例子,我的界限是
bounds = [0, 2*np.pi]
Run Code Online (Sandbox Code Playgroud)
我正在使用该scipy.optimize.minimize函数来最小化我的距离函数,使用边界.上述过程的结果如下图所示.
这是显示距sin函数的距离的等高线图.请注意轮廓中是否存在不连续性.为方便起见,我在不连续点和它们映射到的曲线上的"壁橱"点上绘制了几个点.
这里实际发生的是scipy函数是找到局部最小值(给出一些初始猜测),但不是全局函数,这导致了不连续性.我知道找到任何函数的全局最小值是不可能的,但我正在寻找一种更可靠的方法来找到全局最小值.
找到全局最小值的可能方法是
有关最佳方法的任何建议,或可能解决这个问题的有用功能的方向都会很棒!
我试图准确理解c ++中删除的变量会发生什么.假设我有以下内容.
MyObject * obj;
for (int i = 0; i < 100000000; i++){
obj = someMethodThatReturnsNewMyObject();
obj->doSomething();
delete obj;
}
Run Code Online (Sandbox Code Playgroud)
现在,在实例化时,obj是一个指向MyObject对象的指针.它首先由该线初始化obj = someMethodThatReturnsNewMyObject();.然后一些方法被称为只是为了好玩,并被obj删除.现在我知道当像这样删除某些东西时,它指向的内存空间被清除,指针被设置为什么都没有.
但是,当for循环回来时,我重新初始化指针,导致它分配一个新的内存空间,obj然后指向这个新的空间.但是,指针本身从内存中移除了.在整个循环过程中,它只指向我指出的任何指向或指向任何东西(删除时).
那么我的问题是:指针本身是什么时候,即指针占用的内存空间,什么时候被删除?为什么我不需要删除它,如果我需要删除指向的内存?
我还在学习c ++的所有细节,我对如何根据我正在做的特定任务处理垃圾收集有一个具体的问题.我有一些类,Vector2D包含一个矢量的坐标,以及一组可以对矢量做的数学属性(点积,旋转,缩放等).下面给出了一个给出布局的示例头文件.
#ifndef VECTOR2D_H
#define VECTOR2D_H
class Vector2D{
private:
double x, y;
public:
Vector2D(double var1, double var2, int coordinateType);
Vector2D * normalize();
Vector2D * rotate(double angle);
Vector2D * scale(double value);
};
Run Code Online (Sandbox Code Playgroud)
现在,我以特定的方式创建了这个类,以获得特定的功能.Vector2D比如vec,当我有一个对象时,我希望能够对该对象进行操作并获取一个新对象,而不是更改该vec对象.我也想要链接命令的能力.这样我可以做一些比如缩放vec,然后用命令旋转它vec = vec.scale(5).rotate(45).由于这个原因,这些方法中的每一个都只返回一个新Vector2D对象而不是更改vec参数.
我的问题来自垃圾收集.我只是不知道c ++如何处理这个以及我应该如何处理它.技术上在vec.scale(5)创建一个新的Vector2D对象的过程中创建,然后我做.rotate(45),但然后再也不用了.更重要的是,我甚至无法访问新创建的对象,因为我从未将其分配给任何东西.所以我的问题就是这个.
1)我是否必须担心删除这些新对象或c ++知道自己删除它们?
2)如果我必须删除它,如何在不引用该对象的情况下这样做?
3)如果(2)不能完成但需要完成,我的代码构造是不好的做法?我应该改变它不做我做过的事吗?
谢谢!
我的代码类似于以下内容
import tkinter as tk
from tkinter import Tk
from tkinter import ttk
root = Tk()
ttk.Label(root, text = 'label text', justify = 'center').grid(row=0, column=0)
string = tk.StringVar()
string.set('entry text')
ttk.Entry(root, textvariable = string).grid(row=0, column=1)
mainButton = ttk.Button(root, text = 'BUTTON').grid(row = 1, columnspan = 2)
root.pack()
Run Code Online (Sandbox Code Playgroud)
实际上,这使得第一行在其旁边有一个标签和一个文本框,在同一行上,然后是两个下面的按钮.现在,当按下该按钮时,我想在包含按钮的行中添加新标签/条目,并将按钮向下移动一行.有可行的方法吗?