一、迭代器及生成器

#迭代器:迭代的工具

#1 什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值
# while True:
# print('=====>')

# l=['a','b','c']
# count=0
# while count < len(l):
# print(l[count])
# count+=1

#2 为什么要有迭代器?
#
对于序列类型:str,list,tuple,可以依赖索引来迭代取值,
# 但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式-》迭代器

#3 可迭代的对象(下列都是):obj.__iter__
# name='egon'
# l=[1,2,3]
# t=(1,2,3)
# d={'name':'egon','age':18,'sex':'male'}
# s={'a','b','c'}
# f=open('a.txt','w',encoding='utf-8')
#
# name.__iter__
# l.__iter__
# t.__iter__
# d.__iter__
# s.__iter__
# f.__iter__

#4 迭代器对象(文件是):obj.__iter__,obj.__next__
# f.__iter__
# f.__next__

#总结:
#1 可迭代对象不一定是迭代器对象
#2 迭代器对象一定是可迭代的对象
#3 调用obj.__iter__()方法,得到的是迭代器对象(对于迭代器对象,执行__iter__得到的仍然是它本身)

# d={'name':'egon','age':18,'sex':'male'}
# d_iter=d.__iter__()

# f=open('a.txt','w',encoding='utf-8')
# f_iter=f.__iter__().__iter__().__iter__().__iter__()
#
# print(f_iter is f)

# d={'name':'egon','age':18,'sex':'male'}
# d_iter=d.__iter__()
#
# print(d_iter.__next__())
# print(d_iter.__next__())
# print(d_iter.__next__())
# print(d_iter.__next__()) #迭代器d_iter没有值了,就会抛出异常StopIteration

# f=open('a.txt','r',encoding='utf-8')
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# f.close()

# l=['a','b','c']
# l_iter=l.__iter__()
#
# print(l_iter.__next__())
# print(l_iter.__next__())
# print(l_iter.__next__())
# print(l_iter.__next__())

# d={'name':'egon','age':18,'sex':'male'}
# d_iter=iter(d) #d_iter=d.__iter__()
#
# #len(obj) 等同于obj.__len__()
#
# while True:
# try:
# print(next(d_iter)) #print(d_iter.__next__())
# except StopIteration:
# break
#
# print('=>>>')
# print('=>>>')
# print('=>>>')
# print('=>>>')

#for循环详解:
#1、调用in后的obj_iter=obj.__iter__()
#2、k=obj_iter.__next__()
#3、捕捉StopIteration异常,结束迭代
# d={'name':'egon','age':18,'sex':'male'}
# for k in d:
# print(k)


#总结迭代器的优缺点:
#优点:
#1、提供一种统一的、不依赖于索引的取值方式,为for循环的实现提供了依据
#2、迭代器同一时间在内存中只有一个值——》更节省内存,

#缺点:
#1、只能往后取,并且是一次性的
#2、不能统计值的个数,即长度

# l=[1,2,3,4,5,6]
# l[0]
# l[1]
# l[2]
# l[0]

# l_iter=l.__iter__()
# # print(l_iter)
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))
#
# l_iter=l.__iter__()
# print(next(l_iter))
# print(next(l_iter))
# print(next(l_iter))

# print(len(l_iter))

生成器

#1 什么是生成器:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器
def func():
print(
'=====>1')
yield
1
print('=====>2')
yield
2
print('=====>3')
yield
3

#生成器就是迭代器
# g=func()
#
# res1=next(g)
# print(res1)
#
#
# res2=next(g)
# print(res2)
#
#
# res3=next(g)
# print(res3)

#yield的功能:
#1、yield为我们提供了一种自定义迭代器对象的方法
#2、yield与return的区别1:yield可以返回多次值 #2:函数暂停与再继续的状态是由yield帮我们保存的

# obj=range(1,1000000000000000000000000000000000000000000000000000000000000000,2)
# obj_iter=obj.__iter__()
# print(next(obj_iter))
# print(next(obj_iter))
# print(next(obj_iter))
# print(next(obj_iter))
# print(next(obj_iter))

# def my_range(start,stop,step=1):
# while start < stop:
# yield start #start=1
# start+=step #start=3
#
#
# g=my_range(1,5,2)
# print(g)

# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# for i in my_range(1,5,2):
# print(i)

#小练习::tail -f access.log | grep '404'
# import time
# def tail(filepath):
# with open(filepath,'rb') as f:
# f.seek(0,2)
# while True:
# line=f.readline()
# if line:
# yield line
# else:
# time.sleep(0.05)
#
# def grep(lines,pattern):
# for line in lines:
# line=line.decode('utf-8')
# if pattern in line:
# yield line
#
#
# lines=grep(tail('access.log'),'404')
#
# for line in lines:
# print(line)

#了解知识点:yield表达式形式的用法
def eater(name):
print(
'%s ready to eat' %name)
food_list=[]
while True
:
food=
yield food_list#food=yield='一盆骨头'
food_list.append(food)
print(
'%s start to eat %s' %(name,food))

e=eater('alex')

#首先初始化:
print(e.send(None)) # next(e)
#然后e.send:1 从暂停的位置将值传给yield 2、与next一样
print(e.send('一桶泔水'))
print(e.send(
'一盆骨头'))

二、面向过程编程

#grep -rl 'python' /etc
#补充:os.walk
# import os
# g=os.walk(r'D:\video\python20期\day4\a')
# # print(next(g))
# # print(next(g))
# # print(next(g))
# # print(next(g))
# for pardir,_,files in g:
# for file in files:
# abs_path=r'%s\\%s' %(pardir,file)
# print(abs_path)

#分析一:

# #第一步:拿到一个文件夹下所有的文件的绝对路径
# import os
#
# def search(target): #r'D:\video\python20期\day4\a'
# while True:
# filepath=yield #fllepath=yield=r'D:\video\python20期\day4\a'
# g=os.walk(filepath)
# for pardir, _, files in g:
# for file in files:
# abs_path = r'%s\%s' % (pardir, file)
# # print(abs_path)
# target.send(abs_path)
#
# # search(r'D:\video\python20期\day4\a')
# # search(r'D:\video\python20期\day4')
#
#
# #第二步:打开文件拿到文件对象f
# def opener():
# while True:
# abs_path=yield
# print('opener func--->',abs_path)
#
#
# target=opener()
# next(target) #target.send('xxxx')
#
# g=search(target)
# next(g)
# g.send(r'D:\video\python20期\day4\a')

#分析二:
# 第一步:拿到一个文件夹下所有的文件的绝对路径
import os
def init(func):
def inner(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return inner

@init
def search(target): # r'D:\video\python20期\day4\a'
while True:
filepath =
yield
g = os.walk(filepath)
for pardir, _, files in g:
for file in files:
abs_path =
r'%s\%s' % (pardir, file)
#把abs_path传给下一个阶段
target.send(abs_path)

# 第二步:打开文件拿到文件对象f
@init
def opener(target):
while True:
abs_path =
yield
with
open(abs_path,'rb') as f:
#把(abs_path,f)传给下一个阶段
target.send((abs_path,f))

#第三步:读取f的每一行内容
@init
def cat(target):
while True:
abs_path,f=
yield
for
line in f:
#把(abs_path,line)传给下一个阶段
res=target.send((abs_path,line))
#满足某种条件,break掉for循环
if res:
break

#第四步:判断'python' in line
@init
def grep(target,pattern):
pattern = pattern.encode(
'utf-8')
res=False
while True
:
abs_path,line=
yield res
res=
False
if
pattern in line:
#把abs_path传给下一个阶段
res=True
target.send(abs_path)

#第五步:打印文件路径
@init
def printer():
while True:
abs_path=
yield
print('<%s>' %abs_path)

g=search(opener(cat(grep(printer(),'python')))) #'python' in b'xxxxx'
g.send(r'D:\video\python20期\day4\a')

#面向过程编程:核心是过程二字,过程指的就是解决问题的步骤,即先干什么后干什么。。。。
#基于该思路编写程序就好比设计一条流水线,是一种机械式的思维方式

#优点:复杂的问题流程化、进而简单化
#缺点:可扩展性差
三、三元表达式

1、def my_max(x,y):
if x >= y:
return x
else:
return y

x=10
y=20

# res=x if x >= y else y
# print(res)

name=input('>>: ').strip()

res='Sb' if name == 'alex' else 'NB'
print(res)

2、列表推导式与生成器表达式

def my_max(x,y):
if x >= y:
return x
else:
return y

x=10
y=20

# res=x if x >= y else y
# print(res)

name=input('>>: ').strip()

res='Sb' if name == 'alex' else 'NB'
print(res)

四、递归调用

#递归调用:在调用一个函数的过程中,直接或者间接又调用该函数本身,称之为递归调用
#递归必备的两个阶段:1、递推 2、回溯

# import sys
# print(sys.getrecursionlimit())
# sys.setrecursionlimit(2000)
# print(sys.getrecursionlimit())

# def func(n):
# print('---->',n)
# func(n+1)
#
# func(0)

# def bar():
# print('from bar')
# func()
#
# def func():
# print('from func')
# bar()
#
# func()

# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
#
# age(1) = 18

# age(n)=age(n-1)+2 # n > 1
# age(1) = 18 #n = 1

# def age(n):
# if n == 1:
# return 18
# return age(n-1) + 2
#
# res=age(5)
# print(res)

# l=[1,[2,[3,[4,[5,[6,[7,]]]]]]]
#
#
# def func(l):
# for item in l:
# if type(item) is list:
# func(item)
# else:
# print(item)

# def func():
# print('===>')
# func()
#
# func()
五、二分法

,,,,,,,,,] :
print(
:],num)

elif num < l[mid_index]:
:mid_index],num)
else:
print(
)

六、匿名函数

,),

七、内置函数

#了解
# print(abs(-1))

# print(all([1,'a','b',0]))
# print(all([]))

# print(any([None,False,0,1]))
# print(any([]))

# print(bin(11))
# print(hex(11))
# print(oct(11))

# print('xxx'.encode('utf-8'))
# print(bytes('xxx',encoding='utf-8'))

# print(callable(max))

# print(chr(65))
# # print(chr(90))
# # print(chr(39))
# print(ord('A'))
# print(ord('@'))

# import os
# print(dir(os))

# s=set({1,2,3})
# s.add(4)
# print(s)

# s=frozenset({1,2,3}) #不可变集合

# print(hash('xxx'))

# l=[1,2,'a',4]
# print(list(reversed(l)))

# s=slice(1,5,2)
# l=['a','b','c','d','e']
#
# # print(l[1:5:2])
# # print(l[1:5:2])
#
# print(l[s])

# print(vars() is locals())

#面向对象
classmethod
staticmethod
property

hasattr
getattr
setattr
delattr

isinstance
issubclass

object

super

# obj.__dict__() #vars(obj)

#__import__
# choice=input('>>: ')
# print(choice,type(choice))
#
# # import 'time'
# m=__import__(choice)
# m.sleep(10)

#掌握:
#divmod
# print(divmod(10011,25))

#enumerate
# l=['a','b','c']

# for i in l:
# print(l.index(i),i,)

# for i,v in enumerate(l):
# print(i,v)

#eval:
# res=eval('[1,2,3]')
# print(res,type(res))

# res=exec('[1,2,3]')
# print(res)

#pow
# res=pow(2,3,3) # (2 ** 3 )%3
# print(res)

#round
# print(round(3.5))

python学习第四天笔记整理的更多相关文章

  1. python学习第四次笔记

    python学习第四次记录 列表list 列表可以存储不同数据类型,而且可以存储大量数据,python的限制是 536870912 个元素,64位python的限制是 1152921504606846 ...

  2. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

  3. 转载-《Python学习手册》读书笔记

    转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html

  4. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  5. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  6. python学习-第四天补充-面向对象

    python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...

  7. python学习第四十八天json模块与pickle模块差异

    在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int st ...

  8. Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)

    原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  9. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

随机推荐

  1. Ubuntu---regex

    摘要:今天我们学习正则表达式(regex),因为掌握这个是用好 grep 命令的前提条件. 1,位置相关的 patten: ^:表示锚定行首,才能匹配. $:表示锚定行尾,才能匹配. ^$:表示匹配空 ...

  2. 【Rails App】 应用服务器从Passenger切换为Puma, Grape出现线程安全问题

    Grape中的代码如下: def market @market ||= Market.find(params[:id]) end @market基于类层次的实例变量,属于非线程安全,如果一直使用多线程 ...

  3. docker-2 tomcat

    启动容器命令 docker run -d -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps -v /root/tomcat/ ...

  4. angular如何引入公共JS

    一.现象 在项目的开发中,总会用到一些公司的脚本方法,同时,不希望在每个页面用到时又得需要引用,有点麻烦. 二.解决 1.在src文件夹下新建文件夹 utils: 2.在utils下新建文件 comm ...

  5. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  6. P2158 [SDOI2008] 仪仗队(欧拉函数模板)

    题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...

  7. Oracle启动和停止

    概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果 ...

  8. Java中的Integer和int

    Java中的Integer是引用类型,而int是基本类型.Integer是int的包装器类型. java中的基本类型有布尔类型boolean;字符类型char;整数类型byte,int,long,sh ...

  9. ssh多台主机之间不用密码远程

    二.多台服务器相互无密码访问 多台服务器相互无密码访问,与两台服务器单向无密码访问的原理是一样的,只不过由于是多台服务器之间相互无密码访问,不能象两台服务器无密码登录那样直接上传,步骤如下: 1.在需 ...

  10. HTML5-桌面提醒功能

    window.webkitNotifications.requestPermission(); statue = window.webkitNotifications.checkPermission( ...