一、函数的参数:
1、位置参数:调用函数时根据函数定义的参数位置来传递参数。
2、关键字参数:用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
3、默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
4、参数组:有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。
基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循) 例: def name(a,b,c,d=1,*args,**kwargs): print(a,b,c,d,args,kwargs) name(2,2,3,33,'asda',asd=1212,bbs=1213) 输出: 2 2 3 33 ('asda',) {'asd': 1212, 'bbs': 1213}
注:*args
表示任何多个无名参数,它是一个tuple;**kwargs
表示关键字参数,它是一个dict。并且同时使用*args
和**kwargs
时,必须*args
参数列要在**kwargs
前
二、内置函数:
Python内置(built-in)函数随着python解释器的运行而创建。在Python的程序中,你可以随时调用这些函数,不需要定义。最常见的内置函数是:
print("Hello World!")
在Python教程中,我们已经提到下面一些内置函数:
基本数据类型 type() 反过头来看看 dir() help() len() 词典 len() 文本文件的输入输出 open() 循环设计 range() enumerate() zip() 循环对象 iter() 函数对象 map() filter() reduce()
下面我采取的都是实际的参数,你可以直接在命令行尝试效果。
数学运算
abs(-5) # 取绝对值,也就是5 round(2.6) # 四舍五入取整,也就是3.0 pow(2, 3) # 相当于2**3,如果是pow(2, 3, 5),相当于2**3 % 5 cmp(2.3, 3.2) # 比较两个数的大小 divmod(9,2) # 返回除法结果和余数 max([1,5,2,9]) # 求最大值 min([9,2,-4,2]) # 求最小值 sum([2,-1,9,12]) # 求和
类型转换
int(") # 转换为整数 integer float(2) # 转换为浮点数 float long(") # 转换为长整数 long integer str(2.3) # 转换为字符串 string complex(3, 9) # 返回复数 3 + 9i ord("A") # "A"字符对应的数值 chr(65) # 数值65对应的字符 unichr(65) # 数值65对应的unicode字符 bool(0) # 转换为相应的真假值,在Python中,0相当于False 在Python中,下列对象都相当于False: [], (), {}, 0, None, 0.0, '' bin(56) # 返回一个字符串,表示56的二进制数 hex(56) # 返回一个字符串,表示56的十六进制数 oct(56) # 返回一个字符串,表示56的八进制数 list((1,2,3)) # 转换为表 list tuple([2,3,4]) # 转换为定值表 tuple slice(5,2,-1) # 构建下标对象 slice dict(a=1,b="hello",c=[1,2,3]) # 构建词典 dictionary
序列操作
all([True, 1, "hello!"]) # 是否所有的元素都相当于True值 any(["", 0, False, [], None]) # 是否有任意一个元素相当于True值 sorted([1,5,3]) # 返回正序的序列,也就是[1,3,5] reversed([1,5,3]) # 返回反序的序列,也就是[3,5,1]
类,对象,属性
# define classclass Me(object): def test(self): print "Hello!" def new_test(): print "New Hello!" me = Me()
hasattr(me, "test") # 检查me对象是否有test属性 getattr(me, "test") # 返回test属性 setattr(me, "test", new_test) # 将test属性设置为new_test delattr(me, "test") # 删除test属性 isinstance(me, Me) # me对象是否为Me类生成的对象 (一个instance) issubclass(Me, object) # Me类是否为object类的子类
编译,执行
repr(me) # 返回对象的字符串表达 compile("print('Hello')",'test.py','exec') # 编译字符串成为code对象 eval("1 + 1") # 解释字符串表达式。参数也可以是compile()返回的code对象 exec("print('Hello')") # 解释并执行字符串,print('Hello')。参数也可以是compile()返回的code对象
其他
input("Please input:") # 等待输入 globals() # 返回全局命名空间,比如全局变量名,全局函数名 locals() # 返回局部命名空间
三、装饰器:
装饰器的定义:本质是函数,为其他函数添加附加功能。 原则:1、不能修改被装饰函数的源代码。 2、不能修改被装饰函数的调用方式。高阶函数+嵌套函数组成装饰器高阶函数:1、函数返回值返回一个函数名。 2、把函数变量名作为变量传到函数里。嵌套函数:函数体里有用def定义的函数。
例:
1、为函数增加计算运行时间的功能: import time def count_time(func): def inner(): start_time = time.time() func() end_time = time.time() print('Time is:',end_time - start_time) return inner @count_time #method1=count_time(method1)=inner def method1(): time.sleep(0.7) print('Is in method1') @count_time def method2(): time.sleep(0.8) print('Is in method2') method1() method2() 输出: Is in method1 Time is: 0.7000398635864258 Is in method2 Time is: 0.8000457286834717 2、如果被修饰函数增加参数并且有返回值: import time def count_time(func): def inner(*args,**kwargs): start_time = time.time() asc = func(*args,**kwargs) end_time = time.time() print('Time is:',end_time - start_time) return asc return inner @count_time def method1(name,age): time.sleep(0.7) print('Is in method1',name,age) return 'Sleep 0.7s' @count_time def method2(): time.sleep(0.8) print('Is in method2') print(method1('cheng',24)) method2() 输出: Is in method1 cheng 24 Time is: 0.700040340423584 Sleep 0.7s Is in method2 Time is: 0.8000457286834717 3、装饰器带参数: import time def count_time(func): print(func) def inner1(method): def inner2(*args, **kwargs): start_time = time.time() asc = method(*args, **kwargs) end_time = time.time() print('Time is:', end_time - start_time) return asc return inner2 return inner1 @count_time(func='pass') #method1 = count_time(func='pass')(method1)=inner1(method1)=inner2 def method1(name,age): time.sleep(0.7) print('Is in method1',name,age) return 'Sleep 0.7s' @count_time(func='cla') def method2(): time.sleep(0.8) print('Is in method2') print(method1('cheng',24)) method2() 输出: pass cla Is in method1 cheng 24 Time is: 0.700040340423584 Sleep 0.7s Is in method2 Time is: 0.8000457286834717
四、迭代器&生成器
生成器generator:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
迭代器:
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;一类是generator
,包括生成器和带yield
的generator function。这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。可以使用isinstance()
判断一个对象是否是Iterable
对象:
而生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存