python基础知识06:函数

本文深入解析了Python中的函数概念,包括作用域、参数传递、拷贝机制等内容,并介绍了不同类型的参数及如何使用lambda表达式和递归函数。

python基础知识06:函数

1.函数的底层分析:

  1. emm

2.变量的作用域:

  1. 局部变量:仅限于局部
    全局变量:尽量不用
  2. 局部变量和全局变量同名:优先用局部变量;
    要用全局的,就加上 global
	a = 100 #全局变量
	def f1():
	global a #如果要在函数内改变全局变量的值,增加 global 关键字声明
	print(a) #打印全局变量 a 的值
	a = 300
  1. 在调用函数时:在栈内创建一个 ““栈帧”” ,里边有局部变量,指向堆,用完就没了。
  2. 查看全局变量和局部变量:
	a = 100
	def f1(a,b,c):
	print(a,b,c)
	print(locals()) #打印输出的局部变量
	print("#"*20)
	print(globals()) #打印输出的全局变量
  1. 局部变量vs全局变量:效率局部变量胜

3.参数的传递:

  1. 本质上就是:从实参到形参的赋值操作。
  2. 所有的赋值操作都是“引用的赋值”
  3. 分为两类:(写操作!!!!!)
    1. 对“可变对象”进行“写操作”,直接作用于原对象本身。
    字典、列表、集合、自定义的对象等
    2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填
    充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
    (例如:int、float、字符串、元组、布尔值)

4.浅拷贝和深拷贝:

  1. copy(浅拷贝)、deepcopy(深拷贝)。
    import copy
    浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。
    深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象
  2. 拷贝的深浅与参数传递:
    传递不可变对象时,如果发生拷贝,是浅拷贝
    所以传递不可变对象时,里面的可变对象发生变化,原来的也变


    上图分别是深拷贝和浅拷贝

5.参数的几种类型:

  1. 位置参数(参数传递数不不对的话就报错)
  2. 默认值参数(默认值参数必须位于普通位置参数后面)
  3. 命名参数(f1(c=10,a=20,b=30) #命名参数)
  4. 可变参数:
    可变参数指的是“可变数量的参数”。分两种情况:
    1. *param(一个星号),将多个参数收集到一个“元组”对象中。
    2. **param(两个星号),将多个参数收集到一个“字典”对象中。
  5. 强制命名参数:
	def f1(*a,b,c):
	print(a,b,c)
	#f1(2,3,4) #会报错。由于 a 是可变参数,将 2,3,4 全部收集。造成 b 和 c 没有赋值。
	f1(2,b=3,c=4)

6.lambda表达式用来声明匿名函数:

  1. lambda arg1,arg2,arg3… : <表达式>
	f = lambda a,b,c:a+b+c
	print(f)
	print(f(2,3,4))
	g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
	print(g[0](6),g[1](7),g[2](8))

7.eval()函数:

	#测试 eval()函数
	s = " "p pr ri in nt t( (' 'a ab bc cd de e' ') )" "
	eval(s)
	a = 10
	b = 20
	c = eval(" "a a+ +b b" ")
	lambda 表达式的基本语法如下:
	print(c)
	dict1 = dict(a=100,b=200)
	d = eval(" "a a+ +b b" ",dict1)
	print(d)

8.递归函数:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值