这篇记录下函数和常用的算法,顺便把上一篇的知识总结 ,写一个案例。
- 函数
为了方便调用,通常都会按功能需求将一大串代码写在一个函数下,这和其他语言也一样。函数的定义如下:
def 函数名(参数1,参数2,*args,默认参数,**kwargs):
'''注释:函数功能和参数说明'''
函数体
return 返回值
在不调用的情况下函数只读入内存不执行任何操作,若要调用时再一步一步进行
上一段冒泡排序的代码:
def bubble_sort(ary):
n = len(ary)
for i in range(n):
flag = True # 标记
for j in range(1, n - i):
if ary[j] < ary[j-1]:
ary[j], ary[j-1] = ary[j-1], ary[j]
flag = False
# 某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了
if flag:
break
return ary
l = [3,5,1,12,88,6,19,30,27]
newbubble = bubble_sort(l)
print(newbubble)
函数还可以嵌套
#闭包函数
def func():
name='alex'
def bar():
print(name)
return bar
b=func()#b就等于bar
b()#这个b()就是bar(),就是一个闭包函数
2. 装饰器
装饰器是起到不修改源代码的前提下,对其效果进行修改的作用。同样上一段代码:
def o1(func):
def inner():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner
def o2(func):
def inner():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner
@o1#装饰器装饰了被装饰过后的函数,所以对这个装饰器而言下面的都是一个函数,即打印时的顺序为最上面的装饰器先运行
@o2
def f():
print('in f')
f()
这段代码的输出结果为:
wrapper1 ,before func
wrapper2 ,before func
in f
wrapper2 ,after func
wrapper1 ,after func
Python的内置函数也有许多,常用的在我么这两篇中如print()、input()等,百度了一张图,贴在下面,用到的时候可以在官网:https://docs.python.org/3/library/functions.html#object 查询
另外补充一个知识点:迭代器和生成器
l = [1,2,3,4]
l_iter = l.__iter__()#l_iter只是一个接受的变量
while True:
try:
item = l_iter.__next__()
print(item)
except StopIteration:
break
生成器其实是开发者自己写的,使用yield语句而不是return语句返回结果。
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
import time
def func():
a = 1
print('现在定义了a变量')
yield a
b = 2
print('现在又定义了b变量')
yield b
g1 = func()
print(next(g1)) #等效于 g1.__next__()
time.sleep(1) #sleep一秒看清执行过程
print(g1.__next__())#每print一次next才会出来一个yield的值,不然就挂在上一个yield上不继续执行
输出为:
现在定义了a变量
1
现在又定义了b变量
2
其中在1和现在有定义了b变量之间可以明显看到间隔。
留一个题目
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test() #[0,1,2,3]
print(type(g))
for n in [1,10]:
g=(add(n,i) for i in g) #for循环的一种写法 遍历i在g中,返回add(n,i)
print(list(g))#输出结果为:[20,21,22,23]