函数
- 基础:定义、参数、返回值
- 进阶:
- 默认参数如果是可变类型 : {} [] 集合 内部元素可以被修改的类型 有坑,不建议使用
- 作用域
py:
if 1==1:
name = 'test'
# 等于: test 没有问题
print name
for i in range(10):
pass
#此时外面是可以使用i,此时值为: 9
print(i)
java:
if (1==1){
String name = 'test';
#可以打印,java 作用域 以 {为分界线}
system.out.println(name);
}
#执行会报错,不允许
system.out.println(name);
- 闭包
- 装饰器 @+嵌套的函数 -> 目的,不修改原函数内容的前提下,在函数的执行前后自定义操作
- 内置函数
sum/abs/hex/int/oct/bin/chr/ord/len/rang/id(比较内存地址) ....
open -> 文件操作 ,操作模式有: r (只读) w(只写,会将原有数据清空) a(追加) rb wb ab b 表示得到的是原始的2进制数据
- 生成器函数 (编码中不常用,源码常使用)
- 表象:如果函数中出现了yield关键字,就是生成器函数
- 意义: 节省内存
- 创建 1~100000 数字时, -> 如果直接在内存创建,占用内容太大
- 创建 1~100000 数字时, ->yield使用过程中,边使用边创建
# 传统函数
def info():
v1 = 100
v2 = 200
return v1, v2
# 定义的函数不会执行,只有调用时才会执行 ,函数名后面加 () 表示调用
ret = info()
print(ret)
# 1、生成器函数
def info():
v1 = 100
yield v1 + 10
v2 = 200
yield v2 + 10
return v1 + v2
# 2、执行生成器函数,就不会执行函数内部的代码,V1=100, v2=200 return 都不会执行,而是直接返回一个生成器对象
ret = info() #
# 此时ret 为 generator object对象
# 3、通过next + 生成器对象,执行函数中的代码
# 此时会进入函数内部,先执行v1= 100,然后执行 yield v1 +10 ,一旦执行完yield 表示当前执行已经结束了,
# 当前执行状态进行冻结,会将后续 yield后续的内容返回
vaule = next(ret)
# 此时vaule的值为:110
print(vaule)
#在次执行next,会接着上次冻结的状态,继续往后面走,执行: yield v2 + 10
vaule = next(ret)
# 此时vaule的值为:210
print(vaule)
# 4、执行完毕后,在次执行 next(ret) ,会报错提示:stopIteration: 表示当前这个生成器执行完了
vaule = next(ret)
# 报错StopIteration: 300
print(vaule)
# 解决:会报错提示:stopIteration 报错方法
def info():
v1 = 100
yield v1 + 10
v2 = 200
yield v2 + 10
return v1 + v2
#ret生成器对象
ret = info()
for item in ret:
print(item)