2019-03-15-day011-递归生成器
函数的进阶:
动态参数:
两种: 动态位置参数 > 动态默认参数
打散(聚合):
- 实参处打散
- 形参处聚合
- 不在函数中第一次使用*打散,第二次是聚合
- 在数据库中快速写入数据的时候,**dic
名称(命名)空间:
加载顺序:
- 内置
- 全局
- 局部
取值顺序:
- 局部
- 全局
- 内置
命名空间作用域:
- 全局 全局 + 内置
- 局部 局部
函数的注释:
函数注释的作用: 清晰描述函数的功能及参数和返回值
好处,在不知道这个函数是什么的情况下,省去看代码的时间
函数名.__doc__ # 查看函数的注释
函数名.__name__ 函数的名字 反射
global,nonlocal
global: 在局部空格直接修改全局变量,如果没有就创建一个
a = 6
def func():
global a
a = 6
# a+=1 # a = a + 1
# print(a)
func()
def func():
b = 10
def aa():
global b
b = 3
print(b)
aa()
print(b)
func()
print(b)
nonlocal:在局部空间内,
修改离自己最近的上一层变量,如果没有继续向上一层查找,
直到局部顶层没有就报错.
函数的嵌套:
def 函数1:
def 函数2:
def func():
func1()
def func1():
print(2)
func2()
def func2():
print(1)
func()
什么是嵌套作用域?
def func():
a = 3
def a1():
b = 1
print(b)
解构
*c,a,b,d,e = [1,2,3,4]
print(c)
函数名的使用
def func():
pass
print(func) # 函数的内存地址
def func():
print(1)
a = func
a()
func() # 函数名可以当做值赋值给变量
def func():
print(1)
def func2():
print(2)
li = [func,func2]
print(li) # 函数名可以当做元素放到容器里
def func():
def aa():
print(2)
return None
return aa() # return None
func() # func() == None
def f():
def a():
def b():
def c():
return '哈撒给!'
return c()
return b()
return a()
print(f())
for i in range(3):
def func(x):
print(x*i)
func(2) # 0 2 4
li = [] # [func,func,func]
for i in range(3):
def func(x):
print(x*i)
li.append(func)
for func in li: # [func,func,func]
func(2) # 0 2 4 0 2 4 0 2 4
# 0 2 4
# 0 0 0 2 2 2 4 4 4
li = []
for i in range(3):
def func(x,i):
print(x*i)
li.append(func)
for func in li:
func(2)
li = []
for i in range(3):
def func(x,y=i):
print(x*y)
li.append(func)
for func in li:
func(2)
def s():
print(1)
def func(s11):
s11()
func(s)
闭包
- 一个嵌套函数
- 在嵌套函数的内部函数使用外部(非全局的变量)
满足以上两条就是闭包
def wrapper():
a = 10
def inner():
print(a)
# print(inner.__closure__) # 不是None 就是闭包
inner()
wrapper()
def wrapper():
a = 10
def inner():
print(a)
return inner
inner = wrapper()
inner()
def wrapper():
a = 10
def inner():
print(a)
return inner
wrapper()()
money = 10
全局里存放会有污染和不安全的现象
def wrapper():
money = 10
def inner(num):
nonlocal money
money += num
print(money)
return inner
wrapper()(100)
python中闭包,会进行内存驻留, 普通函数执行完后就销毁了
全局里存放会有污染和不安全的现象
面试必问,装饰器 -- 装饰器的本质就是闭包
闭包有个弊端:会出现内存泄漏
迭代器
可迭代对象:
- 可以被for的就是可迭代对象
- Python 协议
- 具有.__iter__方法的就是可迭代对象
- a = 对象.__iter__ # 创建一个迭代器
- 具有__iter__和__next__就是一个迭代器
for i in [1,2,3]:
print(i)
li = [1,2,3]
a = li.__iter__()
a.__iter__()
a.__next__()
li = [1,2,3]
a = li.__iter__()
print(a.__next__())
print(a.__next__()) #一个一个取
print(a.__next__())
b = li.__iter__()
print(b.__next__())
print(b.__next__())
print(b.__next__())
迭代器特性:
- 惰性机制
- 不能从下向上走
- 一次性的,用完就没了
python
for i in [1,2,4,3]:
print(i)
for的机制:
li = [1,2,3,4,6,7,87,8,9,90,0,0,0,0,8,7,7,67,]
em = li.__iter__()
while 1:
try:
print(em.__next__())
except StopIteration:
break
for i in range(10):
print(i)
扩展
dic = {'1':1} # 8679250325822402967 = 1
print(hash('1'))
递归
- 自己玩自己 (自己调用自己本身)
- 玩的有限制 (有明确结束条件)
import sys
sys.setrecursionlimit(10)
count = 0
def func():
global count
count += 1
print(count)
if count == 500:
return
func()
func()
def func(n):
n+=1
print(n)
if n == 100:
return
func(n)
func(0)
1,1,2,3,5,8,13,21,34,55
超出了递归的最大层次
递归默认层次,官方说明 1000,实际测试 998/997
def func(age):
age = age + 1
print(age)
if age == 5:
return
func(age)
func(2)
def func(age):
print(age)
def func1(age):
print(age)
func(age+1)
def func2(age):
print(age)
func1(age+1)
func2(2)
今日总结
1.函数名的使用:
- a = 函数名
- a()
- 返回值 函数名
- 返回函数名的时候不能加括号
- 函数名: 可以容器的元素
- 函数名可以当做参数被传递
2.闭包:
- 首先有一个嵌套函数
- 嵌套函数内部函数调用非全局的变量
- 将内部函数名当做返回值返回,在全局调用
- 怎么去查看闭包??
- 函数名.__closure__ 返回None 就不是闭包
3.迭代器:
- 可迭代对象: 具有__iter__方法就是可迭代对象
- 迭代器: 具有__iter__方法,__next__就是迭代器
- for循环的机制 就是迭代器,
4.递归:
def func(n):
n+=1
print(n)
if n == 5:
return
func(n)
func(2)
- 递归的效率比较低,尾递归的用时 和 for的用时 是一样的,比for慢
- 递归的应用场景:
- 在不明确要循环的次数时候,可以用递归
- 递归操作文件目录
5. 面试题 查询数据
2019-03-15-day011-递归生成器的更多相关文章
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 2019.03.15王苛震——myls
/* 1.尝试实现ls命令的功能 加选项-l -a -i -h */ #include <stdio.h> #include <sys/types.h> #include &l ...
- 2019.03.03 - Linux搭建go语言交叉环境
编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...
- PSP(16/03/14-16/03/15)
//整理了自己过去的时间记录文件,最早用电子版记录是15/04/21,依旧断断续续记录到15/11/21,每月至少三次记录,然而自己并没有对数据进行整理,只是纯粹记录,真是浪费了花在上面的时间.期间八 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM
因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...
- MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)
本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...
- python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
- python 基础(四) 正则,递归 生成器
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...
- python- 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fa ...
随机推荐
- 『计算机视觉』Mask-RCNN_推断网络其六:Mask生成
一.Mask生成概览 上一节的末尾,我们已经获取了待检测图片的分类回归信息,我们将回归信息(即待检测目标的边框信息)单独提取出来,结合金字塔特征mrcnn_feature_maps,进行Mask生成工 ...
- java getInstance()的使用
转自:https://www.cnblogs.com/roadone/p/7977544.html 对象的实例化方法,也是比较多的,最常用的方法是直接使用new,而这是最普通的,如果要考虑到其它的需要 ...
- html5 meta标签的认知储备
在开发移动或者PC端的时候除了'<meta charset="UTF-8">'这个设置编码格式的meta标签,还有一些其他方面的设置 一.<meta name=& ...
- hdu多校1004 Distinct Values
Distinct Values Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): ...
- RESTful API单元测试(十九)
下面针对该Controller编写测试用例验证正确性,具体如下.当然也可以通过浏览器插件等进行请求提交验证. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- SpringMVC中JSP页面显示为源码
@RequestMapping(value = "login") public ModelAndView login(ModelAndView mav) throws Except ...
- \x 和 0x 的区别
1.0x 表示整型数值 (十六进制) char c = 0x42; 表示的是一个数值(字母B对应的ASCII码—— 66),可以认为等价于: int c = 0x42; 2.\x42用于字符表达,或 ...
- firstchild.data与childNodes[0].nodeValue意思
x.firstchild.data:获取元素第一个子节点的数据: x.childNodes[0]::获取元素第一个子节点; x.childNodes[0].nodeValue.:也是获取元素第一个子节 ...
- unity3D 中的C#脚本一个类调用另一类中简单方法
案例展示 SubMenuManage类中的实例化代码如下: static SubMenuManage sub_this; public static SubMenuManage Instance() ...
- 启动项目时出现java.io.EOFException异常。
错误: 2018-4-18 10:55:54 org.apache.catalina.session.StandardManager doLoad 严重: IOException while load ...