f-strings格式化、迭代器、生成器

1、建议小写f:

name = "宝元"
age = 18
sex = "男"
msg = F"姓名:{name},性别:{age},年龄:{sex}"
msg1 = f"姓名:{name},性别:{age},年龄:{sex}"
print(msg)
print(msg1)
结果:  姓名:宝元,性别:18,年龄:男

     姓名:宝元,性别:18,年龄:男

2、表达式:字典取值、列表取值、函数表达式
函数计算:
def func(a,b):
return a + b
msg = f"运行结果{func(1,2)}"
print(msg)
结果:运行结果3
列表切片:
lst = [1,2,32,34,45,5]
msg = f"运行结果:{lst[0:3]}"
print(msg)
结果:运行结果:[1, 2, 32]
字典取值:
dic = {"key":1,"key1":22}
msg = f"运行结果:{dic['key1']}"
print(msg)
结果:运行结果:22
三元表达式:
a = 10
b = 20
msg = f"{a if a > b else b}"
print(msg)
结果:20
3、迭代器:  具有__iter__()和__next__()方法就是一个迭代器
优点:     节省内存
        文件句柄就是迭代器
        迭代器:一个一个取值
        for循环就是一个迭代器
        迭代器也是一个可迭代对象
缺点:     只能一个方向直行
        一次性的
        不能灵活操作、不能直接查看元素个数
应用:     内存小、数据量巨大时、建议使用迭代器
4、可迭代对象:  str、list、tuple。。。
优点:     
python中规定、只要具有__iter__()方法就是可迭代对象

        可迭代对象能重复取值
        使用灵活(每个可迭代对象都有自己的方法)
        能够直接查看元素的个数
缺点:     占内存
应用:     内存空间大、当数据量比较少、建议使用可迭代对象。
str.__iter__()
list.__iter__()
dict.__iter__()
set.__iter__()
tuple.__iter__()
lst = [1,2,3,4,5]
5、转换:     将可迭代对象转换成迭代器
l = lst.__iter__()
print(l)
结果:<list_iterator object at 0x00000000027187F0>
有多少个元素就只能next多少次
取值:
print(l.__next__())
6、注意点:
lst = [1,2,3,4,5]
print(lst.__iter().__next__())  #lst.__iter__()是一个迭代器1
print(lst.__iter().__next__())  #lst.__iter__()是一个迭代器2
7、for循环本质:
s = "alex"
s1 = s.__iter__()
while True:
  try:  #尝试着运行一下缩进体中的代码
    print(s1.__next__())
  except StopIteration:
    break
8、两种方法:
方法一:
lst = [1,2,3,54]
l = lst.__iter__()
print(l.__next__())
方法二:
lst = [1,2,3,54]
l = iter(lst)
print(next(l))
9、时间换空间:用大量的时间换取一些空间变小--只能一点点的next、例如迭代器、生成器
空间换时间:使用大量的空间来节省时间、例如列表、可迭代对象、
10、生成器的本质就是一个迭代器
11、生成器和迭代器的区别?
              迭代器:文件句柄、通过数据转换python自带提供
              生成器:程序员自己实现
12、生成器的目的:不在通过数据转换实现、而是通过代码编写实现。
  生成器的定义:基于函数实现的生成器
        表达式实现生成器
13、函数体中存在yield就是定义一个生成器
def func():
print(1)
yield 5
print(func())  #创建一个生成器对象的内存地址
print时打印的是一个生成器对象的内存地址
14、语法分析
  词法分析
15、生成器怎么用?
特点:惰性机制
def func():
yield 1  #记录执行位置的
yield 2
yield 3
a = func() #获取的是生成器的内存地址
print(next(a)) #取值
print(next(a)) #取值
print(next(a)) #取值
结果:1
   2
   3
16、区分迭代器和生成器?
            查看是否可用send方法
            看内存地址(主推荐的)
17、生成器一定是一个迭代器、但是迭代器不一定是一个生成器
18、迭代器和生成器的优点:
            节省空间
  迭代器和生成器的缺点:
            不能直接使用元素
            不能直观查看元素的个数
            使用不灵活
            稍微消耗时间
            一次性的、不能逆行
19、yield from--将列表整体返回
def func():
yield from [1,2,23,54,5]
g = func()
for i in g:
print(i)
结果: 1
    2
    23
    54
    5
20、yield from--将列表逐个返回
def func():
yield from [1,2,23,54,5]
g = func()
print(next(g))
21、yield from小坑
def func():
lst1 = ["卫龙","老冰棍","北冰洋","牛羊配"]
lst2 = ["馒头","花卷","豆包","大饼"]
yield from lst1
yield from lst2
g = func()
for i in g:
print(i)
结果: 卫龙
    老冰棍
    北冰洋
    牛羊配
    馒头
    花卷
    豆包
    大饼
22、yield 能返回多个、以元组的形式存储
  yield 能返回各种数据类型(python的对象)
  yield 能够写多个并且都执行
  yield 能够记录执行位置
  yield 后边不写内容、默认返回None
  yield 都是将数据一次性返回
23、作业题:
# 1.请写出下列代码的执行结果
def func1():
print('in func1')
def func2():
print('in func2')
ret = func1
ret() #in func1
ret1 = func2
ret1() #func2
ret2 = ret
ret3 = ret2
ret2() #in func1
ret3() #in func1
# 2、
def func1():
print ( 'in func1' )
def func2():
print ( 'in func2' )
def func3(x, y): #x = func2,y = func1
x () #func2()
print ( 'in func3' )
y () #func1()
print ( 111 ) #111
func3 ( func2, func1 ) #in func2
#in func3
#in func1
print ( 222 ) #222
# 3、选做题
def func1():
print('in func1')
def func2(x): #x == func1
print('in func2')
return x #return下func1就是把func1返回
def func3(y): #y == func2
print('in func3')
return y
ret = func2(func1) #ret == func1
ret() #func1()
ret2 = func3(func2) #ret == func2
ret3 = ret2(func1) #func2(func1) #ret3 == func1
ret3() #func1()
# 结果:in func2
# in func1
# in func3
# in func2
# in func1
# 4、
def func(arg):
return arg.replace('alex', '****')
def run():
msg = "Alex和大家都是好朋友"
result = func(msg)
print(result)
run()
data = run()
print(data)
# 结果:Alex和大家都是好朋友
# Alex和大家都是好朋友
# None
# 5、
data_list = []
def func(arg):
return data_list.insert(0, arg)
data = func('绕不死你')
print(data) #None
print(data_list) #data_list = ['绕不死你']
# 6、
def func():
print('你好呀')
return '好你妹呀'
func_list = [func, func, func]
for item in func_list:
val = item()
print(val)
#你好呀
# 好你妹呀
# 你好呀
# 好你妹呀
# 你好呀
# 好你妹呀
# 7、
def func():
print('你好呀')
return '好你妹呀'
func_list = [func, func, func]
for i in range(len(func_list)):
val = func_list[i]()
print(val)
# 你好呀
# 好你妹呀
# 你好呀
# 好你妹呀
# 你好呀
# 好你妹呀
# 8、
def func():
return '大烧饼'
def bar():
return '吃煎饼'
def base(a1, a2):
return a1() + a2()
result = base(func, bar)
print(result) #大烧饼吃煎饼
# 9、
def func():
for item in range(10):
pass
return item
func()
# 结果:空
# 10、
def func():
for item in range(10):
pass
yield item
func()
# 结果:空
# 11、
item = '老男孩'
def func():
item = 'alex'
def inner():
print(item)
for inner in range(10):
pass
inner()
func() #类型错误、int对象不可调用
# 12、
l1 = []
def func(args):
l1.append(args)
return l1
print(func(1)) #[1]
print(func(2)) #[1,2]
print(func(3)) #[1,2,3]
# 13、
name = '宝元'
def func():
global name
name = '男神'
print(name) #宝元
func()
print(name) #男神
# 14、
name = '宝元'
def func():
print(name)
func() #宝元
# 15、
name = '宝元'
def func():
print(name)
name = 'alex'
func() #报错赋值前引用的局部变量
# 16、
def func():
count = 1
def inner():
nonlocal count
count += 1
print(count)
print(count)
inner()
print(count)
func()
#结果: 1
# 2
# 2
# 17、
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print('list1=%s'%list1) #list1 = [10,'a']
print('list2=%s'%list2) #list2 = [123]
print('list3=%s'%list3) #list3 = [10,'a']
# 18、
def extendList(val,list=[]):
list.append(val)
return list
print('list1=%s'% extendList(10)) #list1=[10]
print('list2=%s'% extendList(123,[])) #list2=[123]
print('list3=%s'% extendList('a')) #list3=[10, 'a']
#18、用你的理解解释一下什么是可迭代对象,什么是迭代器。
# python中规定、只要具有__iter__()方法就是可迭代对象、例如:str字符串、list列表、tuple元组
#具有__iter__()和__next__()方法就是一个迭代器、例如:文件句柄就是迭代器
#19、使用while循环实现for循环的本质(面试题)
s = "alex"
s1 = s.__iter__()
while True:
try:
print(s1.__next__())
except StopIteration:
break
原文地址:https://www.cnblogs.com/zhang-da/p/11631112.html