零碎积累II
■ global关键字用于把跟着的变量声明为全局变量。在看似不属于其的命名空间里也可以引用它。
■ 讲一个一维列表二维化的方式,用简单的一行语句来表达:
[[array[rows*y+cols] for cols in range(y)] for rows in range(x)] #array是一个一维列表(或者数组),x表示二维化后的行数,y表示列数
■ 想用C,java里面的switch语句结构,但是python里没有的时候,可以
1. 搞很多个if判断,不过这样很繁琐
2. 建立一个字典,key是switch的各个case的值,而value写函数对象进行相应的操作
■ 关于在函数的参数前加*,分成两个情况
1.在定义函数的时候:需要知道的是,很多场合下写的*args,**kwargs中的args和kwargs只是一种习惯,你可以把它换成其他变量名称,在函数中换那个名称引用就可以了。
一个*表示函数可以接受任意多个函数,它会把所有不是实名参数的参数整合成一个元组,并把其作为参数名代表的对象。比如:
def test(paraA,paraB,*args): print paraA print paraB print type(args),args if __name__ == "__main__": test(1,2,3,4,5) #输出: 1 2 <type ‘tuple‘> (3,4,5)
两个**表示可以接受任意多个实名参数,即传参数的时候超过限额的部分也可以加上参数的名称了。而函数会把kwargs整合成一个字典供函数引用。比如:
def test(paramA,paramB=‘B‘,**kwargs): print paramA print paramB print type(kwargs),kwargs if __name__ == "__main__": test(1,2,C=3,D=4,F=5) #输出 1 2 <type ‘dict‘> {‘C‘:3,‘D‘:4,‘F‘:5} test(1,2,3,4,5) #报错,参数个数不对
2. 调用函数时加上*
当在调用函数时参数前加上*,(这个参数通常是个sequence之类的iterable对象)意思是把参数值拆分成一个个小单元,并将小单元一一传递给函数作为参数。单元的个数和函数定义时要求的参数值一致。比如:
def test(a,b,c): print "a:",a print "b:",b print "c:",c if __name__ == "__main__": test(*[1,2,3]) #输出: a: 1 b: 2 c: 3
■ 说到函数的实名虚名参数问题,还有一个顺序问题需要注意。就是说在定义和使用时虚名参数一定要放在实名参数之前
def func(a,b,c=1) 正确
def func(a,b=1,c) 错误
■ zip函数
zip函数接受包括0个在内任意多个sequence作为参数。将每个sequence的[0]组合成元组1,[1]组合成元组2........
最终返回的是[元组1,元组2,元组3....]
如果参数的长度参差不齐,那就以短的序列为标准,即长的序列多于最短的那个长度的那部分全部都舍去
■ if和else可以写在一行里
比较容易想到的是[x for x in range(10) if x%2 == 0]这样的列表生成器
这种列表表达式还可以接上else:[x if x%2 == 0 else x*3 for x in range(10)] 相当于偶数原封不动输出,奇数乘以三
上面这种表达式的根源是类似后面这个表达式的用法 a if a>0 else -a (计算绝对值)
在函数的返回语句中大概可以通过这样的表达式来做一个最后的判断。return a if a > 0 else -a
■ 类里面可以出现一些常量,写在所有成员方法的外面,前面不用写self.,但是调用的时候要用self.常量名调用。
比如:
class test(): class_dict = {"ip":"127.0.0.1"} def __init__(self): self.port = 8080 def __str__(self): return self.class_dict.get("ip"),self.port print test() >>>127.0.0.1 8080
但是一般来说和java里面不一样,这些常量起的都是一些辅助作用