20200303----python学习第17天
Posted limin1027
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20200303----python学习第17天相关的知识,希望对你有一定的参考价值。
今日内容
迭代器
生成器
装饰器
项目结果
logging模块
内容回顾
1.函数(内置函数与自定义函数)
(1)基本函数的结构
def func(a1,a2):pass
参数/返回值/执行函数
(2)函数小高级 函数做参数/函数做变量
(3)函数中高级 函数做返回值/函数的嵌套
(4)装饰器&闭包
(5)匿名函数
(6)递归
(7)内置函数
2.模块(内置模块/第三方模块/自定义模块)
(1)定义模块
内置:time/json/os/sys/datetime....[re模块]
第三方:安装
方法一:pip包管理工具:pip install xlrd
方法二:源码安装:
a.下载源码包:压缩文件;b。解压文件;c:打开cmd窗口,并进入此目录:cd C:Python36Libsite-packages
d.执行:python36 setup.py build(以安装setup.py文件为例)
e.执行:python36 setup.py install(以安装setup.py文件为例)
备注:安装路径为:C:Python36Libsite-packages(每人情况不同)
目前了解的第三方模块:xlrd/requests
自定义
py文件/文件夹__init__.py
(2)调用模块
import
import 模块1 调用方法为:模块1.函数()
import 模块1.模块2.模块3.模块4 调用方法为:模块1.模块2.模块3.模块4.函数()
from xx import xxx
from 模块1.模块2 import 函数 调用方法:函数()
from 模块1.模块2 import 函数 as f 调用方法:f()
from 模块1.模块2 import * 调用方法:函数1() 函数2()
from 模块1 import 模块2 调用方法:模块2.函数()
from 模块1 import 模块2 as m 调用方法:m.函数()
特殊情况
文件夹与包的区别:包多了一个__init__.py的文件
import文件夹 加载__init__.py
3.其他
a.两个值数据交换
b.推导式:列表/集合/字典
详细内容
1.迭代器
自己不会写迭代器,只用
任务:请展示列表中所有的数据
方法一:while+索引+计数器
方法二:迭代器:对模块对象(str/list/tuple/dict/set类创建的对象)可迭代对象中的元素进行逐一获取。具体表象为:具有__next__方法且每次调用都获取可迭代对象中的一个元素(从前到后意义获取)
列表转换为迭代器:
v1= iter([1,2,3,4])
v1 = [1,2,3,4].__iter__()
迭代器想要获取每个值,反复调用val = v1.__next__()
"""
v1 = [11,22,33,44,55]
#列表转换为迭代器
v2 = iter(v1)
result1 = v2.__next__()
print(result1) #输出结果为:11
result2 = v2.__next__()
print(result2) #输出结果为:22
result3 = v2.__next__()
print(result3) #输出结果为:33
result4 = v2.__next__()
print(result4) #输出结果为:44
result5 = v2.__next__()
print(result5) #输出结果为:55
"""
"""
v1="alex"
v2 = iter(v1)
while True:
try:
val = v2.__next__()
print(val)
except Exception as e:
break
#输出结果为:a l e x
"""
#直到报错:stoplteration错误,表示已经迭代完毕。
#如何判别一个对象是否是迭代器:内部是否有__next__方法;
for循环
v1 = [11,22,33,44]
#1.内部会将v1转换成迭代器
#2.内部反复执行,迭代器:__next__()
#3.取完不报错
for item in v1:
print(item)
2.可迭代对象
# #内部具有__iter__()方法且返回一个迭代器。
# v1 = [11,22,33,44]
# v2 = v1.__iter__() #转换为迭代器
# #可以被for循环
3.生成器
‘‘‘
#函数
def func():
return 123
func()
#生成器函数(内部是否包含yield)
def func():
print(‘f1‘)
yield 1
print(‘f2‘)
yield 2
print(‘f3‘)
yield 3
print(‘f4‘)
yield 1
print(‘f1‘)
yield 4
‘‘‘
#函数内部代码不会执行,返回一个生成器对象
‘‘‘
v1 = func()
#生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行;
for item in v1:
print(item)
def func():
count = 1
while True:
yield count
count += 1
val = func()
for item in val:
print(item)
‘‘‘
#总结:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,
#生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值。
‘‘‘
def func():
count = 1
while True:
yield count
count +=1
if count ==100:
return
val = func()
for item in val:
print(item)
‘‘‘
‘‘‘
#读文件
def func():
""""
分批去读取文件中的内容,将文件的内容返回调用者
:return:
"""
curson = 0
while True:
f = open(‘bd‘,‘r‘,encoding = "utf-8") #通过网络连接上redis
#代指 redis[0:10]
f.seek(curson)
data_list = []
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
curson = f.tell()
f.close() #关闭于redis的连接
for row in data_list:
yield row
for item in func():
print(item)
‘‘‘
总结
迭代器:对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个next方法,用于以一个个获取数据。
可迭代对象:可以被for循环且此类对象中都有一个iter方法且要返回一个迭代器(生成器)
生成器:函数内部有yield则就是一个生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。
特殊的迭代器:
‘‘‘
def func():
yield 1
yield 2
yield 3
v = func()
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)
‘‘‘
特殊的可迭代对象:
def func():
yield 1
v = func()
result = v.__next__()
print(result)
以上是关于20200303----python学习第17天的主要内容,如果未能解决你的问题,请参考以下文章