day5:协成函数与import、for...import...的使用
一、协程函数
1、把函数的执行结果封装好__iter__和__next__,即得到一个迭代器
2、与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值
3、函数暂停与再继续运行的状态是有yield保存
# def func(count):
# print('start')
# while True:
# yield count
# count+=1
#
# g=func(10)
# # print(g)
# print(next(g))
#
# print(next(g))
yield的表达式形式的应用
# def eater(name):
# print('%s 说:我开动啦' %name)
# while True:
# food=yield
# print('%s eat %s' %(name,food))
#
# alex_g=eater('alex')
# print(alex_g) # print(next(alex_g))
# print('==============>')
# print(next(alex_g))
# print('==============>')
# print(next(alex_g))
用法:
# def eater(name):
# print('%s 说:我开动啦' %name)
# food_list=[]
# while True:
# food=yield food_list
# food_list.append(food) #['骨头','菜汤']
# print('%s eat %s' %(name,food))
#
# alex_g=eater('alex')
# #第一阶段:初始化
# next(alex_g) #等同于alex_g.send(None)
# print('===========>')
#
# #第二阶段:给yield传值
# print(alex_g.send('骨头')) #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
# # print('===========>')
# print(alex_g.send('菜汤'))
# print(alex_g.send('狗肉包子'))
# def eater(name):
# print('%s 说:我开动啦' %name)
# food_list=[]
# while True:
# food=yield food_list
# food_list.append(food) #['骨头','菜汤']
# print('%s eat %s' %(name,food))
#
#
# def producer():
# alex_g=eater('alex')
# #第一阶段:初始化
# next(alex_g)
# #第二阶段:给yield传值
# while True:
# food=input('>>: ').strip()
# if not food:continue
# print(alex_g.send(food))
#
#
# producer() #解决初始化问题
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper @init
def eater(name):
print('%s 说:我开动啦' %name)
food_list=[]
while True:
food=yield food_list
food_list.append(food) #['骨头','菜汤']
print('%s eat %s' %(name,food)) alex_g=eater('alex')
#第二阶段:给yield传值
# print(alex_g.send('骨头')) #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
# print('===========>')
二、递归
递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身
直接
# def func():
# print('from func')
# func()
#
# func() #间接
# def foo():
# print('from foo')
# bar()
#
# def bar():
# print('from bar')
# foo()
#
# foo()
# 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
#
# print(age(5))
递归的执行分为两个阶段:
1 递推
2 回溯
# l =[1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]
#
# def search(l):
# for item in l:
# if type(item) is list:
# search(item)
# else:
# print(item)
#
# search(l)
#
三、二分法
# l = [1,2,5,7,10,31,44,47,56,99,102,130,240]
#
#
# def binary_search(l,num):
# print(l) #[10, 31]
# if len(l) > 1:
# mid_index=len(l)//2 #1
# if num > l[mid_index]:
# #in the right
# l=l[mid_index:] #l=[31]
# binary_search(l,num)
# elif num < l[mid_index]:
# #in the left
# l=l[:mid_index]
# binary_search(l,num)
# else:
# print('find it')
# else:
# if l[0] == num:
# print('find it')
# else:
# print('not exist')
# return
#
# binary_search(l,32)
#二分法
l = [1,2,5,7,10,31,44,47,56,99,102,130,240] def binary_search(l,num):
print(l)
if len(l) == 1:
if l[0] == num:
print('find it')
else:
print('not exists')
return
mid_index=len(l)//2
mid_value=l[mid_index]
if num == mid_value:
print('find it')
return
if num > mid_value:
l=l[mid_index:]
if num < mid_value:
l=l[:mid_index]
binary_search(l,num) binary_search(l,32)
四、import的用法
导入模块干了哪些事:
1 执行源文件
2 以一个源文件的全局名称空间
3 在当前位置拿到一个模块名,指向2创建的名称空间
# import spam
# money=100000000000
# def read1():
# print('from test')
# # print(spam.money)
# # print(spam.read1)
# # spam.read1()
#
# # spam.read2()
# spam.change()
# print(money)
# spam.read1() #
# import spam as s1
# print(s1.money)
# sql_type=input('sql_type: ')
# if sql_type == 'mysql':
# import mysql as sql
#
# elif sql_type == 'oracle':
# import oracle as sql
#
# sql.sqlparse() import sys
print(sys)
import spam
print(spam)
五、for...import的用法
优点:使用源文件内的名字时无需加前缀,使用方便
缺点:容易与当前文件的名称空间内的名字混淆
# from spam import money,read1,read2,change
# money=0
# print(money)
# print(read1)
#
# read1() # def read1():print('ok')
# read2() #
# money=10
# change()
# print(money) # from spam import money as m
#
# print(m) from spam import * # print(_money)
# read1()
# print(read2) print(money)
print(x)
print(read1)
day5:协成函数与import、for...import...的使用的更多相关文章
- ThinkPHP函数详解:import方法
import方法是ThinkPHP框架用于类库导入的封装实现,尤其对于项目类库.扩展类库和第三方类库的导入支持,import方法早期的版本可以和java的import方法一样导入目录和通配符导入,后来 ...
- 【ABAP系列】SAP ABAP 给初学者-解读function函数的export和import等参数
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 给初学者-解读 ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
- Python基础(协程函数、内置函数、递归、模块和包)-day05
写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04 ...
- python基础之协程函数、列表表达式、生成器表达式
一.协程函数 协程函数的定义?如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数称为协程函数 协程函数补充: def init(func): def wrapper( ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- python自动化 协程函数、二分查找、模块搜索
协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式
一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...
随机推荐
- appium+python自动化50-生成定位对象模板templet(jinja2)
前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...
- Android 自己收集的开源项目集合(持续更新 2018.2.5)
2017.12.21 1.仿QQ说说发图片选择框架 https://github.com/yaozs/ImageShowPicker 2.炫酷开屏动画框架 https://github.com/Jos ...
- [转载] Spring3.1 Cache注解
需要感慨一下,spring3.0时丢弃了2.5时的spring-modules-cache.jar,致使无法使用spring来方便的管理cache注解,好在3.1.M1中增加了对cache注解的支持, ...
- C语言中setjmp与longjmp学习笔记
C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型: int setjmp(jmp_buf envbuf) ,然而longjm ...
- xss测试用例小结
<script>alert("跨站")</script> (最常用) <img scr=javascript:alert("跨站" ...
- vue项目构建实战基础知识:SPA理解/RESTful接口介绍/static目录配置/axios封装/打包时map文件去除
一.SPA 不是指水疗.是 single page web application 的缩写.中文翻译为 单页应用程序 或 单页Web应用,更多解释请自行搜索. 所有的前端人员都应该明白我们的页面的 u ...
- 【Python】装饰器实现日志记录
好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...
- os.waitpid()无法获取sys.exit()退出时的status code
[目的] 父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程. (常见的应用场景是:子进程接收外部命令,收到"stop"时退出 ...
- 云计算之路-试用Azure:制作虚拟机自定义镜像
虚拟机自定义镜像(Image)是一个很有用的功能,可以在一台虚拟机上配置好基本的系统环境,然后做个镜像,以后创建虚拟机直接从这个镜像创建,会省掉很多重复的配置工作. 阿里云与UCloud都有这个功能, ...
- Spring官方下载地址
改版后的Spring官方网站下载地址找不到了,汗~~ 可以通过该链接下载对应的包:http://repo.spring.io/milestone/org/springframework/ Spring ...