标签:
十一、函数
Python中函数以def定义,用于实现某种功能,若是某段代码被多处使用,不妨将它定义成一个函数,或是它用于实现特定的功能,也可以将它定义成一个函数;
一个函数func(),func为函数名,是这个函数引用(指向函数的地址);而加上括号func()则表示执行这个函数;
在函数中定义的变量为局部变量,在函数体为不可引用它(在for循环中定义的变量,for循环体之外可引用);
函数的动态参数func(*args1, **args2),*args1会将传进来的参数以元组的形式存在args1中,**args2会将以特定形式传进来的参数以字典的形式存在args2中,例如:func(a, b, c, name = ‘Jom‘, age = ‘17‘),其中a、b、c为变量,name和age为key,等号后面的作为value;
在文件中函数不会被运行,Python只是去加载它,除非它被引用执行;Python文件有一个系统变量为“__name__”,默认值为当前文件名,但是被执行的文件默认值为“__main__”,所以可以使用"if ‘__name‘ == ‘__main__‘:"作为文件的执行入口;
若是这个函数没有使用return指定这个函数的返回值,那么这个函数的返回值默认为None。
>>> def func(*args1, **args2): # 动态参数指不用指定参数参数个数和各个参数的形参名
print(args1)
print(args2)
print(args1[2])
print(args2[‘name‘])
>>> func
<function func at 0x0000000003450598>
>>> result = func(1, 2, 3, name = ‘Jom‘, age = ‘17‘)
(1, 2, 3)
{‘age‘: ‘17‘, ‘name‘: ‘Jom‘}
3
Jom
>>> print(result) # 没有使用return指定返回值
None
十二、迭代器与生成器
迭代器:
迭代器用于访问集合中的元素,使用迭代器不需要提前准备好要迭代的所有元素,只有迭代到某个元素时才会计算该元素,这个元素之前或之后都是没有的,因为迭代器这个特点,它遍历集合元素占用的内存很少,适用于访问一些特别大的甚至是无限的集合;
迭代器迭代元素时使用__next__()方法不断地去访问下一个元素,只能“前进”,不能“后退”,也不能通过下标等去访问某个特定的元素;
当访问完集合后,这个迭代器就“完了”,要想再遍历这个集合,就要新建一个迭代器了。
生成器:
如果一个函数被调用时返回了一个迭代器,那么这个函数就叫做生成器;如果一个函数中含有yield语法,那么这个函数也是生成器;
yield语法的特点:当含有yield语法的函数被调用后,执行yield后,就会中断这个函数,继续执行这个函数之后的代码,当下一次这个函数再被调用时,会从这个函数的上次执行的yield之后的代码开始执行。
>>> def generator(): n = 3 while n > 0: yield ‘hello python!‘ # 含有yield,这个函数即为生成器,每次生成一个字符串“hello python!” n -= 1 >>> iterator = generator() # 返回一个迭代器 >>> iterator.__next__() ‘hello python!‘ >>> iterator.__next__() ‘hello python!‘ >>> iterator.__next__() ‘hello python!‘ >>> iterator.__next__() # 访问完后就“没有了”,这个迭代器也不能再用了 Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> iterator.__next__() StopIteration >>>
十三、装饰器
装饰器的作用就是为已存在的对象添加额外的功能,特点在于不用改变原先的代码即可扩展功能;
一个对象可以被多个装饰器装饰,装饰器也可以带参数装饰(如下例中可以这样@decorator(func1, func2),当然参数也是函数名,而hello就会被作为装饰器返回值所代表的函数(inner())的参数了,不再直接是decorator()的参数了(decorator()的参数已被func1和func2占用了)),这里就只展示装饰器基本原理和流程。
def decorator(func): print(‘hello python!‘) def inner(name): print(‘hello, my friend‘) func(name) # func即为hello()函数 return inner @decorator # 装饰器用@表示,函数decorator()装饰函数hello() def hello(name): print(‘hello %s!‘ % name) hello(‘Jom‘) # 执行函数 -------------------------------------------------------------- hello python! hello, my friend hello Jom!
在加载装饰器时,也就是加载到@符时,会运行一次装饰器(也就是被@修饰的函数),它的返回值会替代被修饰的函数地址,而被修饰的函数的地址以装饰器函数参数的形式传进了装饰器。示例中:加载到@decorator时,运行了一次decorator()函数,这时函数hello()把函数名(也就是函数地址hello)作为装饰器参数func传了进去,decorator()执行完后返回函数inner()的函数地址(这个函数地址替代了函数hello()的函数地址),执行hello(‘Jom‘)时,就会执行替换后的函数,即inner(‘Jom‘),然后就会去执行inner()函数内的内容。
标签:
原文地址:http://www.cnblogs.com/guyuyun/p/5771069.html