1. 程式人生 > >python 2018.7.17

python 2018.7.17

www. 另一個 馬雲 不讓 xxx iter Coding lib 返回值

1, 函數名的應用,第一類對象
函數名可以像變量一樣進行使用
1.賦值
2.作為list元素
3.作為參數
4.作為返回值
# def func():
# print("你吃了麽?")
#
# # print(func)
# # a = func # 函數名就是一個變量
# # print(a)
# # func()
# # a() # 就是一個函數的調用
#
# def a():
# print("我吃了")
#
# func = a
# func()

# a = 8
# b = 7
# c = 1
# d = 3
# lst = [a, b , c, d]
# print(lst)
#
# def f1():
# print("我是馬化騰")
# def f2():
# print("我是馬雲")
# def f3():
# print("我是馬賽克")
# def f4():
# print("我是馬蔚華")
#
# lst = [f1(), f2(), f3(), f4()]
# print(lst)


# 還可以作為函數的參數
# def func(food):
# print("吃", food)
#
# a = "火鍋"
# func(a)


# def func(fn):
# fn()
#
# def gn():
# print("我是火鍋, 剛才有人要吃我")
# func(gn) # 可以把函數作為參數, 傳遞給另一個函數


# def func():
# def inner():
# print("火鍋不讓吃了. 吃了上火")
# return inner
# ret = func() # 這裏func()執行之後獲取到的是inner函數
# ret() # 這裏是讓inner函數執行

# 綜上. 函數就是一個變量


2, 閉包
內部函數訪問外部函數的局部變量.
好處:
1.安全
2.常駐內存. 提高效率
# name = "wusir"  # 變量寫在全局是不安全的
#
# def abc():
# global name
# name ="呵呵"
# abc()
#
# def func():
# name = "alex" # 常駐內存 防止其他程序改變這個變量
# def inner():
# print(name) # 在內層函數中調用了外層函數的變量,叫閉包, 可以讓一個局部變量常駐內存
# return inner
#
#
# ret = func()
# ret() # 執行的是inner()
# ret()
# ret()
# ret()
# ret()

# 閉包的好處
from urllib.request import urlopen
def but():
content = urlopen("http://www.h3c.com/cn/").read()
def inner():
print("你好啊")
# return content # 在函數內部使用了外部的變量 . 閉包
print(inner.__closure__) # 查看inner是否是閉包, 如果有東西就是閉包, 沒東西就不是閉包
return inner
print("加載中........")
fn = but() # 這個時候就開始加載校花100 的內容
# 後?需要?到這??的內容就不需要在執??常耗時的?絡連接操作了
content = fn() # 獲取內容
print(content)
content2 = fn() # 重新獲取內容
print(content2)

3, 叠代器
可叠代對象(Iterable):內部包含__iter__().
叠代器(Iterator): 內部含有__iter__() __next__()
str, list, tuple, set, dict
f, range

叠代器的特點:
1.省內存
2.惰性機制
3.只能向前.
# s = "北京歡迎您"
# for c in s:
# print(c)

# for i in 123:
# print(i)
# 可叠代對象: str, list, tuple, set, f, dict
# 所有的以上數據類型中都有一個函數__iter__(), 所有包含了__iter__()的數據類型都是可叠代的數據類型 Iterable
# dir()來查看一個對象,數據類型中包含了哪些東西
# lst = [1,2,3] # list
# # print(dir(lst))
# s = "王尼瑪"
# print("__iter__" in dir(s))
# print("__iter__" in dir(lst))
# print("__iter__" in dir(123))

# list是一個Iterable.可叠代的
# lst = ["皇阿瑪", "皇額娘", "容嬤嬤", "紫薇"]
# 獲取叠代器
# it = lst.__iter__()
# # 叠代器往外拿元素. __next__()
# print(it.__next__()) # 皇阿瑪
# print(it.__next__()) # 皇額娘
# print(it.__next__()) # 容嬤嬤
# print(it.__next__()) # 紫薇
# print(it.__next__()) # 叠代到最後一個元素之後. 再進行叠代就報錯了

# lst = ["皇阿瑪", "皇額娘", "容嬤嬤", "紫薇"]
# # 模擬for循環
# it = lst.__iter__()
# while True:
# try:
# name = it.__next__()
# print(name)
# except StopIteration: # 拿完了
# break

lst = [1, 2, 3]
from collections import Iterable # 可叠代的
from collections import Iterator # 叠代器

# isinstence(對象, 類型) 判斷xx對象是否是xxx類型的
# print(isinstance(lst, Iterable))
# print(isinstance(lst, Iterator))

# it = lst.__iter__()
# print(isinstance(it, Iterable)) # 判斷是否是可叠代的 叠代器一定是可叠代的
# print(isinstance(it, Iterator)) # 叠代器裏面一定有__next__(), __iter__()

# print("__iter__" in dir(lst)) # 確定是一個可叠代的
# print("__next__" in dir(lst)) # 確定不是一個叠代器

# f = open("01 今日內容大綱",mode="r", encoding="utf-8")
# print(isinstance(f, Iterable))
# print(isinstance(f, Iterator))

# 叠代器的特點:
# 1. 節省內存
# 2. 惰性機制
# 3. 只能往前拿. 不能反著拿
lst = ["哈哈", "呵呵"]
it = lst.__iter__()
it.__next__()
print(it.__next__())
print("我要吃黃瓜")
print(it.__next__())

python 2018.7.17