python27期day11:f-strings格式化、迭代器、生成器、做業題。

一、建議小寫f:python

name = "寶元"
age = 18
sex = "男"
msg = F"姓名:{name},性別:{age},年齡:{sex}"
msg1 = f"姓名:{name},性別:{age},年齡:{sex}"
print(msg)
print(msg1)
結果:  姓名:寶元,性別:18,年齡:男

     姓名:寶元,性別:18,年齡:男程序員

二、表達式:字典取值、列表取值、函數表達式
函數計算:
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
三、迭代器:  具備__iter__()和__next__()方法就是一個迭代器
優勢:     節省內存
        文件句柄就是迭代器
        迭代器:一個一個取值
        for循環就是一個迭代器
        迭代器也是一個可迭代對象
缺點:     只能一個方向直行
        一次性的
        不能靈活操做、不能直接查看元素個數
應用:     內存小、數據量巨大時、建議使用迭代器
四、可迭代對象:  str、list、tuple。。。
優勢:     
python中規定、只要具備__iter__()方法就是可迭代對象

        可迭代對象能重複取值
        使用靈活(每一個可迭代對象都有本身的方法)
        可以直接查看元素的個數
缺點:     佔內存
應用:     內存空間大、當數據量比較少、建議使用可迭代對象。
str.__iter__()
list.__iter__()
dict.__iter__()
set.__iter__()
tuple.__iter__()
lst = [1,2,3,4,5]
五、轉換:     將可迭代對象轉換成迭代器
l = lst.__iter__()
print(l)
結果:<list_iterator object at 0x00000000027187F0>
有多少個元素就只能next多少次
取值:
print(l.__next__())
六、注意點:
lst = [1,2,3,4,5]
print(lst.__iter().__next__())  #lst.__iter__()是一個迭代器1
print(lst.__iter().__next__())  #lst.__iter__()是一個迭代器2
七、for循環本質:
s = "alex"
s1 = s.__iter__()
while True:
  try:  #嘗試着運行一下縮進體中的代碼
    print(s1.__next__())
  except StopIteration:
    break
八、兩種方法:
方法一:
lst = [1,2,3,54]
l = lst.__iter__()
print(l.__next__())
方法二:
lst = [1,2,3,54]
l = iter(lst)
print(next(l))
九、時間換空間:用大量的時間換取一些空間變小--只能一點點的next、例如迭代器、生成器
空間換時間:使用大量的空間來節省時間、例如列表、可迭代對象、
十、生成器的本質就是一個迭代器
十一、生成器和迭代器的區別?
              迭代器:文件句柄、經過數據轉換python自帶提供
              生成器:程序員本身實現
十二、生成器的目的:不在經過數據轉換實現、而是經過代碼編寫實現。
  生成器的定義:基於函數實現的生成器
        表達式實現生成器
1三、函數體中存在yield就是定義一個生成器
def func():
print(1)
yield 5
print(func())  #建立一個生成器對象的內存地址
print時打印的是一個生成器對象的內存地址
1四、語法分析
  詞法分析
1五、生成器怎麼用?
特色:惰性機制
def func():
yield 1  #記錄執行位置的
yield 2
yield 3
a = func() #獲取的是生成器的內存地址
print(next(a)) #取值
print(next(a)) #取值
print(next(a)) #取值
結果:1
   2
   3
1六、區分迭代器和生成器?
            查看是否可用send方法
            看內存地址(主推薦的)
1七、生成器必定是一個迭代器、可是迭代器不必定是一個生成器
1八、迭代器和生成器的優勢:
            節省空間
  迭代器和生成器的缺點:
            不能直接使用元素
            不能直觀查看元素的個數
            使用不靈活
            稍微消耗時間
            一次性的、不能逆行
1九、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))
2一、yield from小坑
def func():
lst1 = ["衛龍","老冰棍","北冰洋","牛羊配"]
lst2 = ["饅頭","花捲","豆包","大餅"]
yield from lst1
yield from lst2
g = func()
for i in g:
print(i)
結果: 衛龍
    老冰棍
    北冰洋
    牛羊配
    饅頭
    花捲
    豆包
    大餅
2二、yield 能返回多個、以元組的形式存儲
  yield 能返回各類數據類型(python的對象)
  yield 可以寫多個而且都執行
  yield 可以記錄執行位置
  yield 後邊不寫內容、默認返回None
  yield 都是將數據一次性返回
2三、做業題:
# 1.請寫出下列代碼的執行結果def func1():   print('in func1')def func2():   print('in func2')ret = func1ret()   #in func1ret1 = func2ret1()  #func2ret2 = retret3 = ret2ret2()  #in func1ret3()  #in func1# 二、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 )   #111func3 ( func2, func1 )  #in func2                        #in func3                        #in func1print ( 222 )   #222# 三、選作題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 yret = func2(func1)          #ret == func1ret()                       #func1()ret2 = func3(func2)         #ret == func2ret3 = ret2(func1)          #func2(func1)   #ret3 == func1ret3()                      #func1()# 結果:in func2#       in func1#       in func3#       in func2#       in func1# 四、def func(arg):    return arg.replace('alex', '****')def run():    msg = "Alex和你們都是好朋友"    result = func(msg)    print(result)run()data = run()print(data)# 結果:Alex和你們都是好朋友#       Alex和你們都是好朋友#       None# 五、data_list = []def func(arg):    return data_list.insert(0, arg)data = func('繞不死你')print(data)                      #Noneprint(data_list)                 #data_list = ['繞不死你']# 六、def func():    print('你好呀')    return '好你妹呀'func_list = [func, func, func]for item in func_list:    val = item()    print(val)#你好呀# 好你妹呀# 你好呀# 好你妹呀# 你好呀# 好你妹呀# 七、def func():    print('你好呀')    return '好你妹呀'func_list = [func, func, func]for i in range(len(func_list)):    val = func_list[i]()    print(val)# 你好呀# 好你妹呀# 你好呀# 好你妹呀# 你好呀# 好你妹呀# 八、def func():    return '大燒餅'def bar():    return '吃煎餅'def base(a1, a2):    return a1() + a2()result = base(func, bar)print(result)   #大燒餅吃煎餅# 九、def func():    for item in range(10):        pass        return itemfunc()# 結果:空# 十、def func():    for item in range(10):        pass       yield itemfunc()# 結果:空# 十一、item = '老男孩'def func():    item = 'alex'    def inner():        print(item)    for inner in range(10):        pass    inner()func()  #類型錯誤、int對象不可調用# 十二、l1 = []def func(args):    l1.append(args)    return l1print(func(1))  #[1]print(func(2))  #[1,2]print(func(3))  #[1,2,3]# 1三、name = '寶元'def func():    global name    name = '男神'print(name) #寶元func()print(name) #男神# 1四、name = '寶元'def func():    print(name)func()  #寶元# 1五、name = '寶元'def func():    print(name)    name = 'alex'func()  #報錯賦值前引用的局部變量# 1六、def func():    count = 1    def inner():        nonlocal count        count += 1        print(count)    print(count)    inner()    print(count)func()#結果: 1#       2#       2# 1七、def extendList(val,list=[]):    list.append(val)    return listlist1 = 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']# 1八、def extendList(val,list=[]):    list.append(val)    return listprint('list1=%s'% extendList(10))       #list1=[10]print('list2=%s'% extendList(123,[]))   #list2=[123]print('list3=%s'% extendList('a'))      #list3=[10, 'a']#1八、用你的理解解釋一下什麼是可迭代對象,什麼是迭代器。# python中規定、只要具備__iter__()方法就是可迭代對象、例如:str字符串、list列表、tuple元組#具備__iter__()和__next__()方法就是一個迭代器、例如:文件句柄就是迭代器#1九、使用while循環實現for循環的本質(面試題)s = "alex"s1 = s.__iter__()while True:    try:        print(s1.__next__())    except StopIteration:        break
相關文章
相關標籤/搜索