Python基础系列六:函数

1275-李同学

发表文章数:25

首页 » Python » 正文

1. Python函数类型

Python中的函数可以分为以下几类:

  1. 内置函数
    str 、list()、len()等这些都是内置函数
  2. 标准库函数
    可以使用import导入库,使用库中的函数
  3. 第三方库函数
    第三方提供的库,也是使用import导入库,使用库中的函数
  4. 用户自定义函数
    用户在开发中为适应自身需求定义的函数

2. 函数的定义和调用

核心要点:

  1. 我们使用def来定义函数,然后就是一个空格和函数名称
    python执行def时,会创建一个函数对象,并绑定到函数名变量上
  2. 参数列表
    圆括号内是形参列表,多个参数使用逗号隔开
    形参不需要声明类型,也不需要指定函数返回值类型
    无参数,也必须保留空的括号
    实参列表必须与形参列表一一对应
  3. return 返回值
    如果函数体中包含return语句,则结束函数并返回值
    如果函数体中不包含return语句,则返回None
  4. 调用函数之前,必须先定义函数,即先调用def创建函数对象
    内置函数对象会自动创建
    标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句

3. 形参和实参

形参:定义函数时的参数 def func(a,b)
实参:调用函数时传递给函数的参数 ,func(param1,param2)

4. 函数注释

函数的注释用两个‘’’注释

5. 返回值

return返回值要点:

  1. 如果函数体中包含return语句,则结束循环并返回值
  2. 如果函数体中不包含return语句,则返回None值
  3. 要返回多个返回值,可以使用列表、元组、字典、集合。
def multi(a):
	return [a*10,a*20,a*30]

6. 函数内存分析

Python中,“一切都是对象”。实际上,执行def定义函数后,系统就创建了相应的函数对象。
对于代码

def test(): #定义函数
	print("hello,world")
test() #调用函数
c = test() #指向函数
id(c) == id(test) #True

Python基础系列六:函数

7. 变量的作用域

变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。变量分为:全局变量、局部变量。

7.1 全局变量

在函数和类定义之外声明的变量。作用域为定义的模块,从定义的位置开始到模块结束。全局变量有以下特点:

  1. 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
  2. 全局变量一般做常量使用。
  3. 函数内要改变全局变量的值,使用global声明一下。
  4. 获取所有全局变量,使用globals()

7.2 局部变量

在函数体中声明的变量(包含形参)

  1. 局部变量的引用比全局变量要快,优先考虑使用,在强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高效率
  2. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量,若要使用,先使用global声明一下
  3. 获取所有全局变量,使用locals()
a = 100
def test(): #定义函数
	b = 4
	global a
	print(a)
	a = 300
	print(a)
print(locals()) #打印所有局部变量
print(globals()) #打印所有全局变量

7.3 比较全局变量和局部变量的运行效率

import math
import time
## 全局变量
def test01():
	start = time.time()
	for i in range(100000000000):
		math.sqrt(30)
	end = time.time()
	print("running time is {0}".format(end-start))
## 将全局变量转换为局部变量
def test01():
	start = time.time()
	sqrt1 = math.sqrt()
	for i in range(100000000000):
		sqrt1(30)
	end = time.time()
	print("running time is {0}".format(end-start))

8. 参数的传递

参数的传递本质上是:从实参到形参的赋值。具体操作分为两类:

  1. 对可变对象(字典、列表、集合、自定义对象等)进行写操作,直接作用于原对象本身
  2. 对不可变对象(数字、字符串、元组、function等)进行写操作,会产生一个新的对象空间,并用新的值填充这块空间(起到值传递的作用)。

9. lambda表达式和匿名函数

lambda表达式可以用来声明匿名函数。lambda函数是一种简单的、在同一行中定义函数的方法。lambda函数实际生成了一个函数对象。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。
lambda表达式的基本语法如下:


lambda arg1,arg2,arg3…:<表达式>

arg1,arg2,arg3为函数的参数,<表达式>相当于函数体。运算结果是:<表达式>的运算结果。

10. eval()函数

eval()函数的功能是将字符串str当成有效的表达式来求值并返回计算结果
语法:eval(source[,globals[,locals]])->value
参数:
source:一个Python表达式或函数compile()返回的代码对象
globals:可选,必须是字典
locals:可选,可以是任意对象

11. 递归函数

递归函数:自己调用自己的函数。每个递归函数必须包含两个部分:

  1. 终止条件:表示递归何时结束。一般用于返回值,不再调用自己。
  2. 递归步骤:把第n步的值和第n-1步关联。

递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力,处理数据时慎重使用。

12. 深拷贝和浅拷贝

浅拷贝:只拷贝对象的引用,不拷贝对象的所有子元素
深拷贝:不仅拷贝对象,还拷贝对象的所有子元素

import copy
def testCopy():#浅拷贝
	obj1 = [3,'aa',['a','b','c']]
	obj_copy = copy.copy(obj1)

其在内存中的示意图如下

Python基础系列六:函数

import copy
def testCopy():#深拷贝
	obj1 = [3,'aa',['a','b','c']]
	obj_copy = copy.deepcopy(obj1)

其在内存中的示意图如下

Python基础系列六:函数

13. 嵌套函数

在函数内部定义的函数称作嵌套函数,外部无法访问嵌套函数。在嵌套函数中使用外部函数的变量时,用nonlocal声明。

b = 9
def test01():
	a = 8
	global b
	c = 10
	def add(pram1,pram2):
		nonlocal c ##在嵌套函数中使用局部变量
		sum = pram1+pram2+c
		c = 20
		return sum
	c = add(a,b)

14. LEGB规则

Python中变量的查找遵循LEGB规则,即:Local–>Enclosed–>Global–>Built in

str = "global str"
def outer():
	str = "outer"
	def inner():
		str = "inner"
		print(str)
	inner()
	print(str)
outer()
print(str)	

拜师教育学员文章:作者:1275-李同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Python基础系列六:函数》 发布于2020-09-11

分享到:
赞(1) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录