在看文章的时候发现了一个很好的blog,今天的这篇内容大部分都是来源于这篇文章
大家可以去这篇文章学习
学习一个东西一般要问what, why, how
what
why
how
以下依次给出问题的回答并附上相关例子
list = [1,2,2,3] # 创建一个列表
lst_iter = iter(list) # 列表,元组,字符串均可通过iter()创建为迭代器
print(type(lst_iter)) # lst_iter 变成了list_iterator
print("通过next()输出迭代器下一个元素:")
print(next(lst_iter))
print(next(lst_iter)) # 此语句是相同的
print("也可以通过for循环逐次输出:")
lst_iter = iter(list)
for i in lst_iter: # for循环常与迭代结合使用
print(i)
lst = [x*x for x in range(10)]
lst_generator =(x*x for x in range(10)) # 直接通过()创建生成器
print(f'列表生成表达式:{lst}, 类型为:{type(lst)}')
print(f'列表生成器:{lst_generator}, 类型为:{type(lst_generator)}')
# 使用生成器
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
print(next(lst_generator))
# print(next(lst_generator))
try:
print(next(lst_generator))
except StopIteration:
print('超出')
# 此时迭代数据已经超出,重新赋值 不然不会输出
finally:
print('-'*25)
lst_generator =(x*x for x in range(10)) # 直接通过()创建生成器
# 超出迭代范围时候会抛出StopIteration错误
# 既然生成器是迭代器的一种那么生成器就必然是可迭代得
for x in lst_generator:
print(x) # for循环并不需要担心StopIteration错误
del(dict)
# 判断常用数据类型
from collections import Iterator
from collections import Iterable
# 判断常用数据类型的可迭代对象
lst = [1,2,3]
st = set(lst)
t = tuple(lst)
dct = dict([('a',1),('b',1)])
s = "Hello"
a = 10
## 对文件的判断
print('list是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(lst,Iterable), isinstance(lst,Iterator)))
print('set是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(st,Iterable), isinstance(st,Iterator)))
print('tuple是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(t,Iterable), isinstance(t,Iterator)))
print('dict是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(dct,Iterable), isinstance(dct,Iterator)))
print('string是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(s,Iterable), isinstance(s,Iterator)))
print('数据类型是可迭代对象么:{},list是迭代器么:{}'.format(isinstance(a,Iterable), isinstance(a,Iterator)))
def fibonacci(n):
count, a, b = 0, 0, 1
while count < n:
yield b
a,b = b,a+b
count += 1
return None
h = fibonacci(10)
print(h)
print(next(h))
for x in h:
print(x)
# 当不采用for循环时候会报错
h_1 = fibonacci(6)
print(next(h_1))
print(next(h_1))
print(next(h_1))
print(next(h_1))
print(next(h_1))
print(next(h_1))
# 再执行这一句时候超出报错
try:
print(next(h_1))
except StopIteration as e:
print("返回值:",e.value)
何为函数?
# 函数可以被赋值于其他变量
def func_():
print("this's a function")
func_copy = func_
func_copy()
func()
print(func_copy is func_)
print(id(func_),id(func_copy))
# 函数可以作为变量被定义和传递
def func_o (fc):
print('out')
fc() # 这里的fc为函数变量被传递进来
def func_fc():
print('我就是被传递的')
func_o(func_fc)
print('*'*25)
def fc_1():
print('this is fc_1')
return fc_2
def fc_2():
print('this is fc_2')
fc_ = fc_1()
fc_()
# 该函数其实与上面的实现是一样的
# fc_() = fc_1(fc_2())
函数的执行顺序为func_o(接受传递的参数func_fc(实参),fc为形参) -> 调用func_fc()执行
def func_outer():
a = "Here is in the func_outer but out of func_inner"
print(a)
def func_inner():
b = "Here is in the func_inner"
print(b)
c = 'but i can use out variation\n' + a
print(c)
return func_inner()
f = func_outer
print(f())
# 最后其返回了内部的func_inner()
# 其所返回的不只是该函数对象还包括其外层的作用域
def add_out(o_num):
def add_inner(i_num):
return o_num + i_num
return add_inner
res_fc1 = add_out(12)
res_fc2 = add_out(18)
print(res_fc1(100))
print(res_fc2(100))
# 传入的是同一个输入100的参数但输出却不一样
# 可以封闭内部的细节
# 可以对传入的参数施加外部装饰