第一块 0基础入门Python Day4(89-120)

项目与函数

单词表4

project 项目
generate 生成
parsing 语法分析;剖析
argument 争论/论点
argument 复数
multiple 倍数,多个
Decorator 装饰器
recursion 递归

rang(2)或rang(0,2) 0,1包头不包尾
randint(1,3)必须两参数 1,2,3包头包尾
  • 项目概念

第一块 0基础入门Python Day4(89-120)_第1张图片

函数

  • 将重复代码的封装调用,可增强代码的模块化和提高复用率

格式 :

def 函数名([参数,参数...]):
	函数体 (重复的代码)
import random
def generate_random():
	for i in range(3):
		ran = random.randint(1,100)
		print('第{}次的值为:{}'.format(i,ran))
print (generate_random)  # 
gene =generate_random()
print('___'*22)
print(gene)
generate_random()
# 第0次的值为:67
# 第1次的值为:1
# 第2次的值为:56
# None
__________________
第0次的值为:671次的值为:292次的值为:99

第一块 0基础入门Python Day4(89-120)_第2张图片

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
  • 函数调用:
    函数(固定参数)
    第一块 0基础入门Python Day4(89-120)_第3张图片
  • 函数调用:
    函数(可变参数)
def add (*args):
	#print(args)  # 空元组  ()
	sum = 0 
	if len(args)>0:
		for i in args:
			sum+=1
			print('sum的值是',sum)
	else:
		print('没有元素进行计算')	
# 涉及拆包装包操作
  • 参数中有数字与字符串,这里老需要用到拆装包原则
    如,name 需要在
    args前面
    第一块 0基础入门Python Day4(89-120)_第4张图片
  • 函数 应用于用户名及密码验证
    第一块 0基础入门Python Day4(89-120)_第5张图片
    可变参数+关键字参数
    关键字参数: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传入参数(解包)
    第一块 0基础入门Python Day4(89-120)_第6张图片
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)

第一块 0基础入门Python Day4(89-120)_第7张图片
第一块 0基础入门Python Day4(89-120)_第8张图片

  • 函数嵌套调用
def a():
	print('aaaa')
def b():
	a()
	print('bbbb')
b()  #aaaa
	 #bbbb

第一块 0基础入门Python Day4(89-120)_第9张图片

  • 用户登陆案例
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() 可以通过{ }查看全局变量,注意里面会有一些系统的键值对

第一块 0基础入门Python Day4(89-120)_第10张图片第一块 0基础入门Python Day4(89-120)_第11张图片

  • 闭包
    条件:
    1.外部函数中定义了内部函数
    2.外部函数是有返回值
    3.返回的值是:内部函数名
    4.内部函数引用了外部函数的变量
    第一块 0基础入门Python Day4(89-120)_第12张图片
  • 闭包的特点及应用
    1.可以使用同级的作用域
    2.读取其他元素的内部变量
    3.延长作用域
    第一块 0基础入门Python Day4(89-120)_第13张图片
  • 闭包的总结
    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函数的返回值
第一块 0基础入门Python Day4(89-120)_第14张图片

  • 装饰器
    在闭包的基础上实现
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)	# .inner_func at 0x000001A6233C6D38>
f1()	#	修改后的a: 151
def test ():
	print('------test-----')
t =test
print(t) #  
def func(f):	
	print(f)	#   此时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('我们是一家装修大品牌,我们正为新房子提供装修服务 ')
		print('-------正在装修-----')
		print('装饰完成:拎包入住')
	return add	
def house_last():
	print('这是一个新的房子,毛坯房')
	print('我需要一个装饰的公司对新房进行装饰')
	print('这可怎么办,还需要装修才能入住,我得找一个修饰的公司')
house_last()
@house
def house_last1():
	print('_______________________________________________')
	print('这是一个新的房子,毛坯房')
	print('我找了一个装饰的公司对新房进行装饰')
house_last1()

第一块 0基础入门Python Day4(89-120)_第15张图片

  • 装饰函数想实现万能装饰
    内部函数中用(*arges)可以变成多个参数
    (*arges,**kwargs)就可以变成多个参数加字典参数
    第一块 0基础入门Python Day4(89-120)_第16张图片
    第一块 0基础入门Python Day4(89-120)_第17张图片
  • 多个装饰器
    离的近的先装饰
    第一块 0基础入门Python Day4(89-120)_第18张图片
  • 装饰器带参数
    需要多层装饰器(三层)

第一块 0基础入门Python Day4(89-120)_第19张图片

  • 实例登陆验证
    第一块 0基础入门Python Day4(89-120)_第20张图片

  • 函数的作用域
    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)     # at 0x000002326DE98048>
print(s(3,1))    #4
  • 匿名函数作为参数
    第一块 0基础入门Python Day4(89-120)_第21张图片

  • 匿名函数与内置函数的结合
    第一块 0基础入门Python Day4(89-120)_第22张图片
    第一块 0基础入门Python Day4(89-120)_第23张图片
    第一块 0基础入门Python Day4(89-120)_第24张图片
    第一块 0基础入门Python Day4(89-120)_第25张图片

  • from fuctiontools import reduce
    reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
第一块 0基础入门Python Day4(89-120)_第26张图片
reduce(function, iterable[, initializer])函数必须是有两个参数的

在这里插入图片描述

  • filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
第一块 0基础入门Python Day4(89-120)_第27张图片
在这里插入图片描述
第一块 0基础入门Python Day4(89-120)_第28张图片
在这里插入图片描述

  • 递归函数:调用自身
    1.自己调用自己
    2.一定要有终点,通过有一个入口
    3.方向要往已知值方向
    第一块 0基础入门Python Day4(89-120)_第29张图片

你可能感兴趣的:(python树)