侧边栏壁纸
  • 累计撰写 52 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Chap04.Python 函数编程与作用域

冬天冬天W
2023-12-28 / 0 评论 / 1 点赞 / 37 阅读 / 7556 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-12-28,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Python 函数概述

一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。好处:

  1. 代码重用
  2. 保持一致性
  3. 可扩展性

函数分类

  • 内置函数:python内部已经定义好的函数,可以直接使用,如print()
  • 自定义函数:开发人员因某些功能需求而编写的函数

Python 函数定义与调用

基本格式

# 本段代码为伪代码
def 函数名 ([函数列表]):		# 函数头:关键字def、函数名、括号、冒号、参数(按需求可选)
	函数体					# 函数体:缩进1格

一个简单的例子:

微信截图_

函数的基本结构完成以后,可直接参照内置函数一样调用:

# 定义函数(无参数)
def sayhello() :
	print("Hello World!")
# 调用函数
sayhello()					# out: Hello World!

# 定义函数(带参数)
def sayhello2who(name):
	print("Hello", name)
# 调用函数(带参数)
sayhello2who("Python")		# out: Hello Python

return 语句

用法:return [表达式/结果值]

  • return 语句,用于在退出函数,并向调用方返回一个结果值。
  • 如果没有返回值,就不需要写return,函数默认返回None
# 定义函数(带参数):比较大小
def ReturnMax(a, b):
	if a > b:
		return a
	else:
		return b
a = 4
b = 5
result = ReturnMax(a, b)
print(result)				# out: 5

Python 匿名函数

所谓匿名函数,即不再使用 def 语句这样标准的形式定义一个函数。

python 使用 lambda 来创建匿名函数

微信截图_

# 匿名函数的调用与一般函数相同:函数名称([参数1][,参数2,.....参数n]])

# 可写函数说明
sumlam = lambda arg1, arg2: arg1 + arg2
# 调用sumlam函数
print ("相加后的值为 : ", sumlam( 10, 20 ))	# out: 30
print ("相加后的值为 : ", sumlam( 20, 20 ))	# out: 40

Python 内置函数

微信截图_

用法: 函数名称( [对象] )

举例:abs(x), 求x绝对值

Python 函数参数

函数参数传递,即在函数调用时,把函数外的数据传递到函数体内执行

# 定义函数(带参数)
def sayhello2who(name):
	print("Hello", name)
# 调用函数(带参数)
sayhello2who("Python")		# out: Hello Python

Python 函数参数类型

函数参数分四个类型:位置参数关键字参数默认参数不定长参数

微信截图_

位置参数:

def cal(a, b):
	print(a + b)
	print(a - b)
	print(a * b)
	print(a / b)
# 调用 cal 函数
cal(100, 10)

关键词参数:

def cal(a, b):
	print(a + b)
	print(a - b)
	print(a * b)
	print(a / b)
# 第一次调用 cal 函数
cal(a = 100, b = 10)
# 第二次调用 cal 函数
cal(b = 10, 

默认参数:

def cal(a, b=1):
	print(a + b)
	print(a - b)
	print(a * b)
	print(a / b)
# 第一次调用 cal 函数
cal(100)
# 第二次调用 cal 函数
cal(100, 10)

不定长参数(了解即可):

# 参数传递-不定长参数(元组)
def printinfo_tuple( arg1, *vartuple):
	print ("输出: ")
	print (arg1)
	print (vartuple)
# 调用printinfo 函数
printinfo_tuple( 70, 60, 50)
# 输出:
# 70
# (60, 50)

# 参数传递-不定长参数(字典)
def printinfo_dic( arg1, **vardict ):
	print ("输出: ")
	print (arg1)
	print (vardict)
# 调用printinfo 函数
printinfo_dic(1, a=2, b=3)
# 输出:
# 1
# {'a': 2, 'b': 3}

Python 函数嵌套

函数嵌套,指的是在函数内部定义新的函数内部函数可以被外部调用,但不能被外部直接调用

def fout() :
	def fin():
		print('hi')
# 只能调用最外层函数
fout()

Python 闭包

函数本质是一个对象,若想在外部调用内部函数,可以把内部函数赋值给变量,以return 语句带到外部。

  • 闭包定义

    在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

  • 闭包的构成条件

    1. 在函数嵌套(函数里面在定义函数)的前提下
    2. 内部函数使用了外部函数的变量(还包括外部函数的参数)
    3. 外部函数返回了内部函数
# 函数嵌套
def fout() :
	def fin():
		print('hi')
	return fin # 返回:fin,注意这里返回的名称,没有括号
x = fout() # 调用fout函数,返回 fin函数名称,即 x = fin
x()

理解:

  1. 外部函数 fout 通过 return 返回 内部函数 fin 的名称
  2. x = fout()赋值后,即x=fin
  3. x()即等于fin(),调用函数fin:print('hi')

Python 变量作用域

变量作用域简介

作用域就是变量能够生效的范围,按照作用域划分为局部变量全局变量

  • 全局变量

    定义在函数外的拥有全局作用域,全局变量可以在整个程序内访问

  • 局部变量

    定义在函数内部的变量拥有一个局部作用域,只能在其被声明的函数内部访问

##全局变量
x1 = 10
def func1() :
	print(x1)
func1()

##局部变量,函数外部使用报错
def func2() :
	x2 = 20
	print(x2)
func2()
# 错误示范:print(x2) ##无法访问函数内部的局部变量

Python LEGB规则

Python 访问一个变量时会遵循LEGB规则从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

微信截图_

from math import pi

print(pi) # Buit-in

pi = 3.14 # Global
print(pi)

def fout():
	pi = 3.1 # Enclosing
	def fin():
		pi = 3 # local
		print(pi)
	fin()
	print(pi)
fout()

Python 变量作用域声明

global声明

##局部变量,global声明
pi = 3.14 # Global
print(pi)

def fout():
	pi = 3.1 # Enclosing
	def fin():
		global pi # global声明后,x 变为全局变量
		pi = 3 # local
	fin()
	print("fout:", pi)

fout()
print(pi)

nonlocal声明

##局部变量,global声明
pi = 3.14 # Global
print(pi)

def fout():
	pi = 3.1 # Enclosing
	def fin():
		nonlocal pi # nonlocal声明后,x 变为非局部变量
		pi = 3 # local
	fin()
	print("fout:", pi)

fout()
print(pi)
# fin()调用影响fout函数Local变量,不影响Global变量

Python 装饰器

Python 装饰器定义

装饰器(Decorators),简单地说:就是修改其他函数的功能的函数,本质是函数嵌套

作用:在不改变原函数结构的基础上,通过装饰器使原函数具备更多功能

# 提升孙悟空技能,装饰器做法:增加火眼金睛能力
def furnace(func): # func就是个函数
	def fire(*args, **kwargs): # 三味真火函数
		print('有火眼金睛了') # 增加新技能:火眼金睛
		return func(*args, **kwargs) # 保留原来函数的功能
	return fire # 返回函数名
# 语法糖
@furnace
def monkey():
	print('吃桃子')
monkey()

Python 装饰器定义-语法

装饰器语法

# 装饰器函数(无参数)
def 函数1(func):
	def 函数2(*args, **kwargs) :
		<新功能代码块>
		return func(*args, **kwargs)
	return 函数2
# 装饰器应用
@函数1
def 原函数():
	<代码块>
# 装饰后函数调用
原函数()
# 装饰器函数(带参数)
def 传参函数(arg):
	def 函数1(func):
		def 函数2(*args, **kwargs) :
			<新功能代码块>
			return func(*args, **kwargs)
		return 函数2
	return 函数1
# 装饰器应用
@传参函数(arg)
def 原函数():
	<代码块>
# 装饰后函数调用
原函数()

Python 装饰器应用场景

装饰器被广泛应用以下场景:

  • 拓展权限认证
  • 插入日志
  • 性能测试
  • 事务处理
  • 缓存
  • 权限校验
# 装饰器作用:扩展权限认证
def canYou(func):
	def decorator(*args, **kwargs):
	userAge = 40
	if userAge > 1 and userAge < 10:
		return func(*args, **kwargs)
	print('你的年龄不符合要求,不能看')
return decorator
@canYou
def play():
	print('开始播放动画片 《喜洋洋和灰太狼》')
play()

1

评论区