迭代器与生成器
迭代器:
迭代是是访问集合元素的一种方式,它可以记住遍历对象的位置。迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束。(迭代器只能往前不会后退)
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
print (next(it)) # 输出迭代器的下一个元素;结果为1
print (next(it)) #结果为2
for i in it:
print (i, end=" ") #结果为1 2 3 4
生成器:
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
使用了 yield 的函数被称为生成器(generator),在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
yield 实现斐波那契数列:
import sys
def fib(x):
n, a, b = 0, 0, 1
while n < x:
yield a
a, b = b, a + b
n = n + 1
f=fib(10)
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
结果为:
0 1 1 2 3 5 8 13 21 34 55
函数的理解
函数作用是程序有良好的扩展性、复用性;
同样的功能要是用3次以上的话就建议使用函数,将相同功能的代码封装到函数中,使用时仅调用函数即可
- 调用函数:Python内置了很多有用的函数,我们可以直接调用。在要调用一个函数时,需要知道函数的名称和参数;
- 自定义函数:在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回
格式如下:
def 函数名(参数):
函数体
以自定义一个求1+2+3+…+n的sums函数为例:
i=1
results=0
def sums(n):
if(i<=n):
results +=i
i +=1
return results
print(sums(10)) #调用自定义函数并打印其结果
结果为:
55
- 函数的参数:普通参数,默认参数,动态参数
普通参数在定义参数的时候定义了几个参数,你在调用的时候必须给他几个参数,否则就报错!
默认参数:在你没有给他指定参数的时候他就会使用默认的参数!(默认参数需要放在参数列表最后)
def person(name,age=18):
print("姓名:",name)
print("年龄:",age)
xiaoming=person('xiaoming')
结果为:
姓名:xiaoming
年龄:18
lifang=person('lifang',age=16)
结果为:
姓名:lifang
年龄:16
动态参数:传入的参数个数是可变的,动态扩展的;
def obj(key1,*args_tuple):
执行代码
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数;(如果在函数调用时没有指定参数,它就是一个空元组)
加了两个星号 ** 的参数会以字典的形式导入;
- 匿名函数:不再使用 def 语句这样标准的形式定义一个函数,而使用 lambda 来创建匿名函数;lambda的主体是一个表达式,仅仅能在lambda表达式中封装有限的逻辑进去
#匿名函数应用
add1=lambda x,y:x+y
print(add1(7,9)) #结果为:16
- 函数的作用域:在函数里定义的变量不能被外面使用,但是外部全局定义的全局变量在函数内是可以使用的。
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数;
汉诺塔的移动可以用递归函数非常简单地实现:
"""
规则:
1.每次只能移动一个盘子
2.任何时候大盘子在小盘子的下边
方法:
1.n=1时,A——》C
2.n=2时,
A——》B,
A——》C,
B——》C
3,n=n时,
n-1:A—C—》B
.... A——》C
B——》C
"""
def hanuot(n,a,b,c):
if n<=0:
return
if n==1:
print(a,"--->>",c)
return
if n==2:
print(a,"-->>",b)
print(a,"-->>",c)
print(b,"-->>",c)
return
hanuot(n-1,a,c,b)
print(a,"-->>",c)
hanuot(n-1,b,a,c)
a="A"
b="B"
c="C"
n=input("请输入正整数:")
hanuot(int(n),a,b,c)