1.map函数
map函数用于将指定的数据成员都使用指定函数进行处理。
比如:
1 map(float, arr) 2 map(square, arr)
这两个函数分别将arr中成员转换为float类型,以及对于arr中成员求平方。
还可以通过lamba函数来进行指定匿名函数:
1 map(lambda x: x ** 2, [1, 2, 3, 4, 5]) 2 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
但是注意map函数在python2中返回的是List(原生数组),但是在python3中返回的则是一个迭代器。对于迭代器只能使用for语句进行迭代获取:
1 arr = [1,2,3,4,5]
2 arr = map(square, arr)
3 print(arr)
4 for item in arr:
5 print(item)
>><map object at 0x000000000A396278>
2 frozenset的强大
frozenset修饰过的list奖会不会被修改,同时会给你排序,还会把重复的元素给删掉;当然set处理过的list也是会把数据删掉,并且会排序
3. python默认返回值是None
之前调用tree的一个方法disp()总是返回none,我是百思不得其解
1 class treeNode: 2 def __init__(self, nameValue, numOccur, parentNode): 3 self.name = nameValue 4 self.count = numOccur 5 self.parent = parentNode # 上级树信息 6 self.children = {} # 下级(树枝)树信息 7 self.nodeLink = None 8 def inc(self, numOccur): 9 self.count += numOccur 10 11 def disp(self, ind=1): 12 print (' '*ind, "name: %s, count: %d" %(self.name, self.count)) 13 for child in self.children.values(): 14 child.disp(ind + 1)
调用:
print(" 元素:%s没有在树中...为树创建子节点: %s" % (items[0], newTreeNode.disp()))
这个print总是会输出:
元素:z没有在树中...为树创建子节点: None
None从哪里来的?
想了好久,才想明白,disp这个函数本身是没有返回值的,然而在print中调用改函数本意希望返回一个打印的字符串;但是disp其实是在函数体内部完成了打印,但是并没与把打印内容输出出来。
而python默认的返回值是None;所以你强取返回值获取的就是None;
可以这么讲:disp正确的用法不是在print里面,而是应该单独使用。4.Python中数组双冒号
Python中数组多冒号(:)的问题:[start:end:step],step代表的是步长,很多时候省略start,默认从0开始,省略step默认是1.例如:
arr=[0,1,2,3,4,5,6,7,8,9] arr[0:10:2]
输出为:
[0, 2, 4, 6, 8] 如果步长为负值,则代表要根据当前顺序做逆序排列。然后再取值,例如:
arr=[0,1,2,3,4,5,6,7,8,9] arr[:5:-1]
输出为:
[9, 8, 7, 6] 5. juypter的“未连接至服务”
jupyter notebook可以正常进入到网页,但是发现连不上python3的服务,提示为“未连接至服务”;后来网调发现时因为Juypter里面有个组件tornado版本问题,需要降到5.1.1(之前是6.x),之后juypter可以正常使用。
6. 自定义类和包
自定义的包下面需要有__init__.py的文件(为空无所谓)
在引用的文件中要添加该包的引用路径(包文件所在的父文件夹),例如根目录下创建了一个包,那么需要:
1 import os, sys 2 sys.path.append(os.path.abspath("."))
这里又要给概念,就是包(文件夹),模块(py文件),类(py文件中当以的代码段,通过class关键声明包裹)三者关系。
这里有一个概念要澄清一下,模块其实就相当于Java里面的全局static类,如果里面有变量的话是共享的;如果你需要具有一定的封装性,希望调用方有自己的处理单元,需要定义一个类,因为是通过new获取的处理单元,所以不会有数据共享的问题。
7. 关于from和import
这个需要持续关注,先说一点测试通过的内容
from A import B和 import A.B的差别在于:前者可以直接使用B,而后者必须要全路径引用;
另外,import后面跟的至少是要模块,如果是包名称(对应__init__.py文件),在代码中引用将会导致问题。比如:
1 import sklearn 2 a=sklearn.datasets.load_digits()
将会报错:AttributeError: module 'sklearn' has no attribute 'datasets'
这个是因为如果跟代码跟进sklearn,起始对应的是sklearn包下面的__init__.py文件,这个import是不允许的。
但是在单步执行的情况下,只有一个地方曾经执行过"import sklearn.datasets",那么这个地方就不会报错;因为在IPython机制下,代码是整个执行过程共享的;需要通过“ctrl+Z”退出当前环境,从新敲“python”进入到IPython的环境,再来执行才会继续报错。