栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

08 第八节课笔记(迭代器、匿名函数)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

08 第八节课笔记(迭代器、匿名函数)

迭代器在python中就是属于可以做for循环遍历的对象,也被称为可迭代对象 可迭代对象分为容器和 二、可迭代对象分为容器和迭代器两个,迭代器又有生成器分支。 三、迭代器

“”"
性质:
1.使用print无法查看迭代器中的元素。
2.使用len方法也无法查看其中元素个数。
3.迭代器(iterator)
4.迭代器类似数据结构中的队列(先进先出),迭代器中的元素被取出,即消失。
5.任何容器型数据类型都可以使用iter方法转为迭代器。
“”"
str1 = ‘hello’
str1_iter = iter(str1)
print(str1_iter, type(str1_iter))
list1 = [1, 2, 3]
list_iter = iter(list1)
print(list_iter, type(list_iter))

print(len(list_iter)) # TypeError: object of type ‘list_iterator’ has no len() 四、如何获取迭代器中的元素 方法一:for循环遍历 方法二:next()

print(next(str1_iter))
print(next(str1_iter))
for i in str1_iter:
print(i)

五、迭代器能做什么? 元素被全部取出,迭代器消失,迭代器所占内存被释放,程序就可以减小内存占用。 六、生成器(generator)

“”"
性质:
1.生成器为了生成迭代器(生成器就是迭代器,但是迭代器不一定是生成器)。
2.生成器是一个函数。
3.调用生成器函数时,函数不执行,只有在获取元素时生成器函数才执行,
并且是获取一个元素才能够让生成器函数执行一次。
4.生成器函数返回内部结果使用yield代替return
5.yield执行几次,生成器就产生几个元素
“”"

def myGener():
print(‘123’)
yield 100
yield 200
if 100 > 200:
yield 300
return 1
yield 400

f = myGener()
print(f)
print(next(f))
for i in f:
print(i)

七:yield和return区别

“”"
1.return 被触发,函数立即结束。yield不会结束函数执行。
2.return和yield都可以将函数内部结果返回到外部
3.return和yield后面都是跟表达式
“”"

练习:使用生成器创建Python001-python999学号。

ef stuId():
for i in range(1, 1000):
yield f’python{i:0>3}’

f = stuId()
print(f)
print(next(f))
for _ in range(100):
print(next(f))

================

print(next(f))

匿名函数 一、概念 Python中有一个lambda表达式,lambda有匿名的意思,并且lambda表达式就是简化的函数,所以被叫做匿名函数。 二、理解 匿名函数和普通函数的关系理解为单分支结构和三目运算符的关系。 三、匿名函数在语法上就是有单一的严格限制的固定语法。在语义上是普通函数的语法糖。 语法糖(糖衣语法),是英国的计算机学家提出的一个概念。语法糖就是对已经存在的语法的简化。 语法糖能提高代码的可读性,但是不影响功能。 案例:计算两个数字的和

def numSum(num1, num2):
return num1 + num2

print(numSum(10, 20))

------------------------------------

numSumLambda = lambda num1, num2: num1 + num2
print(numSumLambda(10, 20))

匿名函数语法: 函数名 = lambda 形参:返回值 函数名(实参) 练习:计算1-100的和(使用匿名函数)

def total(start=1, end=100):
sum = 0
for i in range(start, end + 1):
sum += i
return sum

totalLambda = lambda start, end: sum([i for i in range(start, end + 1)])
print(totalLambda(1, 100))

并不是所有的普通函数都可以转为匿名函数 练习:使用匿名函数判断年份是否是闰年

leapYear = lambda year: True if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else False
print(leapYear(2005))

递归 递归就是一种循环的思想。 函数之间是一个相互调用的过程,递归是对于函数来说的,但是递归是一种特殊的函数调用(自己调自己) 迭代(递推)思维和递归思维 递推思维:斐波那契数列:根据已有的数据推算规律(正向的推算) 递归思维:根据规律逆向推算。 递归虽然是循环的思想,但是要注意循环结束的条件,不然就陷入了死循环。 著名的计算机学家:迭代是人,递归是神。 斐波那契数列

a = 1
b = 1
N = 9
for i in range(N - 2):
MID = a + b
a = b
b = MID
print(b)

递归思想来写斐波那契数列代码

def fib(N):
if N == 1 or N == 2:
return 1
else:
return fib(N - 1) + fib(N - 2)

print(fib(9))
“”"
原理:
fib(9) = fib(8) + fib(7)
fib(8) = fib(7) + fib(6)
fib(7) = fib(6) + fib(5)
fib(6) = fib(5) + fib(4)
fib(5) = fib(4) + fib(3)
fib(4) = fib(3) + fib(2)
fib(3) = fib(2) + fib(1)
“”"
“”"
如何写出递归思想的代码:

  1. 知道最终结果的计算规律。
  2. 从需要算的结果向前推。
  3. 了解递归结束的条件
  4. 学会自己调自己的方式
    “”"
递归练习:计算N的阶乘。

def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)

print(factorial(10))

能使用循环解决的就能使用递归。尽量使用for循环来解决。 但是递归使用时需要谨慎,如果涉及计算量很大,有一个拓栈和压栈的过程,拓栈是容易内存溢出。 栈:先进后出 高阶函数 将一个函数当做另一个函数的参数,叫做高阶函数。

print(max)

def func1():
print(‘这是一个函数’)

print(func1)
func1()
a = func1
a()

自定义函数相当于是定义了一个数据类型为function的变量

def func2(func):
print(‘这是另一个函数’)
func()

func2(func1)

Python常用高阶函数:max、min、sorted、map、reduce max、min:获取容器中最大(最小)的元素

nums = [10, 55, 67, 666, 900]
print(max(nums))

max(容器,key=自定义函数):按照函数定义的方式获取容器中的最大值。 自定义函数的要求:(1)函数有且仅有一个形参。(2)必有有返回值。 案例:按照数字中个位数的大小取值(找出那个数字的个位数最大)。

nums = [10, 55, 67, 666, 900]

def unitNum(num):
return num % 10

print(max(nums, key=unitNum))
print(max(nums, key=lambda num: num % 10))
print(min(nums, key=unitNum))

sorted(容器,key=自定义函数):按照函数指定的形式对容器中元素排序 自定义函数的要求:(1)函数有且仅有一个形参。(2)必有有返回值。

nums = [10, 55, 67, 666, 900]
print(sorted(nums, key=lambda num: num % 10))

reduce:根据传递的容器对容器中每个元素做累计。 reduce(函数,容器,初始值) 自定义函数要求: a.自定义函数有两个形参。第一个形参开始指向初始值,然后再指向每次累计的结果。第二个形参指向容器中每个元素。 b.必须有返回值。

from functools import reduce

nums = [10, 55, 67, 666, 900]

对列表中元素做累乘。

print(reduce(lambda total, num: total * num, nums, 1))

reduce和for循环对比: reduce性能明显不及for循环,但是如果从代码可读性(优雅的写法)reduce是更好的。 map():根据容器产生一个新的序列 map(自定义函数, 容器1, 容器2, …) 自定义函数要求: a.函数有N(容器数量)个形参。 b.有返回值。 map函数的结果是一个可迭代对象,可以将这个可迭代对象使用构造器语法转换为列表、元组、集合等容器。

names = [‘小明’, ‘小王’, ‘小李’]
chinese = [90, 95, 80]
english = [60, 70, 80]

{‘name’:‘小明’,‘chinese’:90,‘english’:60}

map_iter = map(lambda a, b, c: {‘name’: a, ‘chinese’: b, ‘english’: c}, names, chinese, english)
print(map_iter)
for i in map_iter:
print(i)
print(list(map_iter))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号