今年想要将深度学习中的CNN加入机器人足球中来,于是在看零基础入门深度学习课程,准备入门深度学习(大佬们请忽略),以下是连接
https://www.zybuluo.com/hanbingtao/note/433855
但是在亲自编程时遇到一些问题,首先我的python版本是3.x,这对于源代码中有些表达或者模块的引用需要更改。其次就是我的python掌握的并不是非常熟练,对于lambda表达式和一些BIF等存在很多问题。下面是我遇到的一些问题总结
一、reduce()
在python2 中,reduce()函数为其BIF,但是python 3.x中reduce()函数从全局名字空间中移除,转移到了functools模块中,所以在python3中要想使用reduce()函数需要引入functools模块然后去调用此函数,如下:
from functools import reduce
reduce()函数语法 :
reduce(function, iterable[, initializer])
reduce()函数的作用是运用函数对参数列表的元素进行累计,即用reduce()函数中的function对可迭代对象中的第一个和第二个元素进行操作,得到结果后再和第三个进行function运算,一直到最后一个元素。
def f(x,y):
return x*y
>>> reduce(f, range(1,4))
6
二、map()
map()函数是python内置的高阶函数,map()函数的语法:
map(function, iterable, ...)
此函数接收一个function和一个list,通过函数function作用在list的每个元素上,最终得到一个新的list并返回。
注意:
1.map()函数不改变原有的list,而是生成一个新的list,因此可以用map()函数将一个list转换成另一个list
2.在python2和python3中,map()函数的返回类型不同,在python2中map()返回的是list类型,但是在python中map()函数返回迭代器iterators类型,想要打印出具体数值需要对map()函数进行list操作,即list(map(...)),否则结果如下:
下面是map()函数应用的一个例子:
def f(x):
return x*x
>>>print(map(f, [1, 2, 3]))
[1,4,9]
三、zip()
zip()函数接受多个可迭代对象作为参数,将这些对象中对应元素打包成一个tuple。
注意:在python2和python3中zip()函数的返回对象不同,python2中返回这些元组打包成的listl列表,但在python3为了节省内存,返回的是一个对象,如果想要打印需要对zi()函数进行list操作。
以下分别是python2和python3中使用zip()函数的例子:
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>zip(a,b) # 打包为元组的列表python2
[(1, 4), (2, 5), (3, 6)]
>>>list(zip(a,b)) #python3
[(1, 4), (2, 5), (3, 6)]
四、匿名函数lambda
lambda函数在python2、3中有很大区别。在python2中lambda函数可以接收多个参数,可以指定作为参数的元素的元组的个数,python2的解释器会把这个元组“解开”成命名参数,然后在lambda函数中引用。python3中仍然可以传递一个元组为lambda函数的参数,但是解释器不会把它解析成命名参数,这时需要通过位置索引来引用每个参数python
python 2 | python 3 | 注释 |
lambda (x,): x + f(x) | lambda x1 : x1[0] + f(x1[0]) | 注1 |
lambda (x,y): x + f(y) | lambda x_y : x_y[0] + f(x_y[1]) | 注2 |
lambda (x,(y,z)): x + y + z | lambda x_y_z: x_y_z[0] + x_y_z[1][0]+ x_y_z[1][1] | 注3 |
lambda x,y,z: x+y+z | 和python2相同 | 注4 |
注1:如果使用包含一个元素的元组作为参数,在python3中会用位置索引x[0]来表示,其中x1是自己定义的,不违反命名原则下可以起其它的名字
注2:类比注1,使用含有两个元素的元组(x,y)作为参数的lambda函数被转换为x_y,它有两个位置参数,即x_y[0]和x_y[1]
注3:可以处理使用嵌套命名参数的元组作为参数的lambda函数,位置参数像二维数组
注4:使用多个参数的lambda函数。python2和python3相同
最后调试程序中遇到的手误的小错误:
关于__name__ == ’__main__’
当模块作为主程序运行的时候,__name__属性的值是“__main__”,当该模块被调用导入到另一个模块的时候,"__name__"属性值为模块名称。注意:是__main__而不是__main()__