Bootstrap

python核心编程(一)

一、python函数

1.1 函数的概念

	概念:  代码实现了一个功能,集中放在一块,起个名字,下一次可以根据这个名字再次使用这个代码块,这就是函数
	
	作用:
		1. 方便代码重用
		2. 分解任务,简化程序逻辑
		3. 使代码更加模块化
	
	函数分类:
		1. 内建函数(python内置的一些函数)
		2. 三方函数(别人写好的,自己直接用)
		3. 自定义函数

1.2 函数的基本使用

	# 函数定义
	def 函数名():
		函数体
	
	# 函数调用
	函数名()

1.3 函数的参数

1.3.1 单个参数

	场景: 需要动态的调整函数体中某一个处理信息,则可以以参数的形式接收到相关数据
	
	定义:def 函数名(参数名称):
	
	函数的调用:函数名(参数值)
	形参和实参的概念:
		1. 上述函数定义中,“参数名称”即为形参
		2. 在调用函数的时候,传递的真实数据,即为实参

1.3.2 多个参数

	场景:需要动态的调整函数体中多个处理信息时,则可以以逗号做分割,接收多个参数
	
	定义:def 函数名(参数名称1,参数名称2):

	调用:
		1. 函数名(参数1,参数2,参数3...)	形参和实参一一对应
		2. 函数名(参数名称1=参数1,参数名称n=参数n...)
			可以指明形参名称,称为“关键字参数”
			不需要严格按照顺序

1.3.3 不定长参数

	场景:如果函数体中,需要处理的数据,不确定长度,则可以以不定长参数的方式接收数据
	
	方式1:
		定义:def 函数名(*args)	函数体内部可以以元组变量的方式使用该参数
		使用:函数名(参数1,参数2,参数3...)
	
	方式2:
		定义:def 函数名(**dic)	函数体中可以直接以字典变量的方式使用该参数
		使用:函数名(参数名称1=参数1,参数名称2=参数2...)
	
	参数拆包:
		装包:把传递的参数,包装成一个集合,称为"装包"
		拆包:把集合参数,再次分解成单独的个体,称为“拆包”
		

1.3.4 缺省参数

	场景:当我们使用一个函数的时候,如果大多数情况下,使用的某个数据是一个固定值,或者属于主功能之外的小功能实现,则可以去使用默认值,这种参数我们称为“缺省参数”
	
	定义:
		def 函数名(变量1=默认值1,变量名2=默认值2)
		在函数体中,即使外界没有传递指定变量,也可以使用,只不过值给的是默认值
	
	使用:
		函数名(变量1,变量2)	此处如果是缺省参数,则可以不填写

1.3.5 参数注意

	值传递和引用传递:
		值传递:传递过来只是原本数据的副本,修改副本,对原件没有任何影响
		引用传递:是指传递过来的,是一个变量的地址,通过地址,可以存在同一份原件
	
	注意:
		1. 在python当中,只有引用传递(地址传递)
		2. 如果数据类型是可变类型,则可以改变原件	
			可变类型有列表,集合,字典
		3. 如果数据类型是不可变类型,则不可以改变原件	
			python里面不可变的数据类型有以下几种,分别是整型,浮点数,字符串,元组,冻结集合,布尔值

1.4 函数的返回值

	场景:当我们通过某个函数,处理好数据之后,想要拿到处理的结果
	
	语法:
		def 函数():
			函数体
			return 数据
	
	注意:
		1. return后续代码不会被执行
		2. 只能返回一次
		3. 如果想要返回多个数据,把多个数据包装称为一个集合,整体返回(列表,元组,字典等)

1.5 函数的使用描述

	场景:当我们编写三方函数,为了方便他人使用,就需要描述清楚我们所写的函数功能以及使用方式等信息
	
	定义格式:
		def calculate(a, b=1):
    		"""
    		计算两个数据的和
    		:param a: 数值1,数值类型,不可选,没有默认值
   	 		:param b: 数值2,数值类型,可选,默认值:1
    		:return: 返回计算的结果
    		"""
    		return a+b
    
    查看函数使用文档		help(函数)
	
	经验:
		一般函数的描述,需要说明如下几个信息:
			1. 函数的功能
			2. 参数	例如:含义,类型,是否可以省略,默认值
			3. 返回值	例如:含义,类型
	

1.6 函数的作用域

	基本概念:变量的作用域
		1. 可操作的范围
		2. python是静态作用域,也就是说在python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间
		
	命名空间: 是作用域的体现形式
			  不同的具体的操作范围
	
	python_LEGB:
		1. L-Local	函数内的命名空间		作用范围:当前整个函数体范围
		2. E-Enclosing function locals	外部嵌套函数的命名空间	作用范围:闭包函数
		3. G-Global	全局的命名空间	作用范围:当前模块(文件)
		4. B-Builtin	内建模块命名空间	作用范围:所有模块(文件)
		
		注意:
		1. python里面没有块级作用域
		2. LEGB规则按照 L->E->G->B的顺序进行查找
	
	基于命名空间的常见变量类型
		1. 局部变量:在一个函数内部定义的变量,作用域为函数内部,查看局部变量 locals()
		2. 全局变量:
			2.1. 在函数外部,文件最外层定义的变量
			2.2. 作用域为整个文件内部
			2.3. 查看全局变量	globals()
		
		注意点:
			1. 访问原则 从内到外
			2. 全局变量命名的时候,用g_b 这样

1.7 相关函数

1.7.1 偏函数

	概念:当我们写一个参数比较多的函数时,如果有些参数,大部分场景下都是某一个固定值,那么为了简化使用,就可以创建一个新函数,指定我们要使用的函数的某个参数,为某个固定的值;这个新函数称为”偏函数“
	
	语法:
		方式1:自己写一个新的
		方式2:借助functools模块的partial函数
			import functools
			newFunc=functools.partial(函数,特定参数=偏爱值)

1.7.2 高阶函数

	概念:当一个函数A的参数,接收的又是另一个函数时,则把这个函数A称为是”高阶函数“
	
	例如:sorted函数(动态的计算两个数据)

1.7.3 返回函数

是指一个函数内部,它返回的数据是另外一个函数,把这样的操作称为”返回函数“

1.7.4 匿名函数

	概念:称为”lambda函数“,顾名思义,就是指没有名字的函数
	
	语法:
		1. lambda 参数1,参数2...:表达式
		2. 限制
			只能写一个表达式		不能直接return
			表达式的结果就是返回值
			所以,只适用于一些简单的操作处理

1.7.5 闭包

	概念:
		1. 在函数嵌套的前提下
		2. 内层函数引用了外层函数的变量(包括参数)
		3. 外层函数,又把内层函数当做返回值进行返回
	
	标准格式:
		def test1(a):
    		b = 10
    		def test2():
        		print(a)
        		print(b)
			return test2
	
	应用场景:外层函数,根据不同的参数,来生成不同作用功能的函数
	
	注意事项:
		闭包中,如果要修改引用的外层变量,需要使用 nonlocal 变量 进行声明,否则会当作是闭包内新定义的变量
		

1.7.6 装饰器

	作用:在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码
	代码:

在这里插入图片描述

	注意:装饰器的执行时间是立即执行

	进阶:
		1. 装饰器叠加 从上到下装饰,从下到上执行
		2. 对有参函数进行装饰
			2.1 无论什么场景,保证函数调用参数个数一致
			2.2 为了通用,可以使用不定长参数,结合拆包操作进行处理
		3. 对有返回值的函数进行装饰	无论什么场景,保证函数返回值一致
		4. 带有参数的装饰器
			4.1	通过@装饰器(参数)的方式,调用这个函数,并传递参数;并把返回值,再次当做装饰器来进行使用
			4.2 先计算@后面的内容,把这个内容当作是装饰器
;