项目与函数
单词表4
project 项目
generate 生成
parsing 语法分析;剖析
argument 争论/论点
argument 复数
multiple 倍数,多个
Decorator 装饰器
recursion 递归
rang(2)或rang(0,2) | 0,1包头不包尾 |
---|---|
randint(1,3)必须两参数 | 1,2,3包头包尾 |
- 项目概念
函数
- 将重复代码的封装调用,可增强代码的模块化和提高复用率
格式 :
def 函数名([参数,参数...]):
函数体 (重复的代码)
import random
def generate_random():
for i in range(3):
ran = random.randint(1,100)
print('第{}次的值为:{}'.format(i,ran))
print (generate_random) # <function generate_random at 0x0000020547838048>
gene =generate_random()
print('___'*22)
print(gene)
generate_random()
# 第0次的值为:67
# 第1次的值为:1
# 第2次的值为:56
# None
__________________
第0次的值为:67
第1次的值为:29
第2次的值为:99
import random
def generate_random(k): # 形参
for i in range(k):
ran = random.randint(1,100)
print('第{}次的值为:{}'.format(i+1,ran))
print (generate_random)
# 调用
generate_random(5) # 实参:5
- 函数调用:
函数(固定参数)
- 函数调用:
函数(可变参数)
def add (*args):
#print(args) # 空元组 ()
sum = 0
if len(args)>0:
for i in args:
sum+=1
print('sum的值是',sum)
else:
print('没有元素进行计算')
# 涉及拆包装包操作
- 参数中有数字与字符串,这里老需要用到拆装包原则
如,name 需要在args前面
- 函数 应用于用户名及密码验证
可变参数+关键字参数
关键字参数:key=value
传的参数要看顺序:位置参数强于关键参数
def add(a,b=1,c=10):
re = a+b+c
print(re)
add(1) # 12
add(1,3)# 14
add(1,6)#17
add(1,c=6)#8
- 可变参数为字典时
**kwarges====>>key word arguments
调用时不能直接传dict参数,可以用 **dict传入参数(解包)
def bb(a,b,*c,**d): # a,b为必不可少项,后面两个参数为可选
print(a,b,c,d)
bb(1,2) # 1 2 () {}
bb(1,2,3,4) # 1 2 (3,4) {}
bb(1,2,x=3,y=4) # 1 2 () {'x':3,'y':4}
bb(1,2,3,x=4) # 1 2 (3,) {'x':4}
- 函数的返回值
将函数的运算成果通过return关键字’扔’出来
只要有return,就要用对象去接这个函数的返回值
返回值如有多个参数,则会放在一个元组中,作为整体返回给对象
如果有多个对象去接多个参数,则会分拆给多个对象
def add(a,b):
result = a+b
return result
z = add(3,4)
print(z)
- 函数嵌套调用
def a():
print('aaaa')
def b():
a()
print('bbbb')
b() #aaaa
#bbbb
- 用户登陆案例
import random
def generate_checkcode(n):
s = '0987654321qwertyuioplkjhgfdsamnbvcxzZXCVBNMLKJHGFDSAPOIUYTREWQ'
code=''
for i in range(n):
ran =random.randint(0,len(s)-1)
code += s[ran]
return code
def login():
username = input('请输入用户名')
password = input('请输入密码')
code = generate_checkcode(5)
print('验证码是:',code)
codel = input('请输入验证码:')
if code.lower()==codel.lower():
if username=='aa'and password=='bb':
print('bingo')
else:
print('用户名/密码有误')
else:
print('验证码有误')
login()
- global全局变量 local局部变量
全局变量如果是不可变, 在函数中作修改,必须 要声明全局变量(str,元组等)
全局变量如果是可变,在函数中作修改,不必须要声明全局变量
(list列表等)
包含内部函数
- 内部函数 | 可以访问外部的变量 |
---|---|
- 内部函数 | 可以修改外部函数的可变类型的变量比如 list, |
- global | 内部 修改全局中不可变时要声明 |
- nonlocal | 内部修改外部函数的不可变变量时要声明 |
- locals() | 可以通过{key:value}查看函数内有什么元素和内函数 |
- global() | 可以通过{ }查看全局变量,注意里面会有一些系统的键值对 |
- 闭包
条件:
1.外部函数中定义了内部函数
2.外部函数是有返回值
3.返回的值是:内部函数名
4.内部函数引用了外部函数的变量
- 闭包的特点及应用
1.可以使用同级的作用域
2.读取其他元素的内部变量
3.延长作用域
- 闭包的总结
1.闭包似优化了变量,原来需要对象完成的工作,闭包也可以完成
2.由于闭包引用了外部函数的局部变量,则外部函数 的局部变量没有及时 释放,消耗内存
3.闭包的好处,使代码变得简洁,便于阅读代码
4.闭包是理解装饰器的基础
def AA():
count=[0]
def BB():
count[0]=count[0]+1
print('第{}次访问'.format(count[0]))
return BB
a =AA()
a() #第1次访问
a() #第2次访问
a() #第3次访问
要用ff : 就是调用iner2的return的值
否则就是f直接调用func函数的返回值
- 装饰器
在闭包的基础上实现
def func(number):
a = 100
def inner_func():
nonlocal a
nonlocal number
number +=1
for i in range(number):
a +=1
print('修改后的a:',a)
return inner_func
f = func(5)
f() # 修改后的a: 106
a = 50
f1 = func(a)
print(f1) # <function func.<locals>.inner_func at 0x000001A6233C6D38>
f1() # 修改后的a: 151
def test ():
print('------test-----')
t =test
print(t) # <function test at 0x000001A6233C6DC8>
def func(f):
print(f) # <function test at 0x000001A6233C6DC8> 此时f就是t也就是test的地址
f() # f既然是test,那这就是test()调用print------test-----
print('------------------>func') # func函数的print------------------>func
func(t) # 完成了从17行定义函数,19行调用函数名,21行函数名作为参数进入func函数
- 丰富函数 ,修饰函数 : 就可以用装饰器
也可以减少在修改调用函数的情况下,重复修改多个地方的代码,省时省力
def house(fun):
def add():
fun()
print('我们是一家装修大品牌<house>,我们正为新房子提供装修服务 ')
print('-------正在装修-----')
print('装饰完成:拎包入住')
return add
def house_last():
print('这是一个新的房子,毛坯房')
print('我需要一个装饰的公司对新房进行装饰')
print('这可怎么办,还需要装修才能入住,我得找一个修饰的公司')
house_last()
@house
def house_last1():
print('_______________________________________________')
print('这是一个新的房子,毛坯房')
print('我找了一个装饰的公司对新房进行装饰')
house_last1()
- 装饰函数想实现万能装饰
内部函数中用(*arges)可以变成多个参数
(*arges,**kwargs)就可以变成多个参数加字典参数
- 多个装饰器
离的近的先装饰
- 装饰器带参数
需要多层装饰器(三层)
-
实例登陆验证
-
函数的作用域
L-E-G-B
L: local 本地
E:enclosing 嵌套
G:global 全局
B:built-in 内置 -
匿名函数:lambda简化书写
格式 lambda 参数1,参数2… : 运算
s = lambda a,b :a+b #s去接收,s就是一个函数地址
print(s) #<function <lambda> at 0x000002326DE98048>
print(s(3,1)) #4
-
匿名函数作为参数
-
匿名函数与内置函数的结合
-
from fuctiontools import reduce
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
reduce(function, iterable[, initializer])函数必须是有两个参数的
- filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
- 递归函数:调用自身
1.自己调用自己
2.一定要有终点,通过有一个入口
3.方向要往已知值方向