2020-11-12 函数

1411-李同学

发表文章数:148

热门标签

首页 » Python » 正文

一、函数

1、函数也是对象:执行def函数后,系统就创建了相应的函数对象。

在堆中创建好函数对象,在栈里保存变量:test01,调用test01即可以在堆中调用函数。在栈中定义一个新的对象,对应的堆也是test01的堆。

2、变量的作用域(全局变量和局部变量)

变量起作用的范围成为变量的作用域

全局变量:global:尽可能少的使用全局变量, 如果想使用全局变量需要在函数内加入global 变量名

局部变量:函数执行完不能在函数外使用

print(locals()) print(“globals()”)

3、局部变量和全局变量效率的测试

import math
import time

def test01():
    start=time.time()
    for i in range(10000000):
        math.sqrt(30)
    end=time.time()
    print("耗时{0}".format((end-start)))



def test02():
    b=math.sqrt
    start=time.time()
    for i in range(10000000):
        b(30)
    end=time.time()
    print("耗时{0}".format((end - start)))



test01()
test02()

4、参数的传递

概念:函数的参数传递本质是从实参到形参的赋值操作。

1)对可变对象进行操作:直接作用于原对象本身

2)对不可变对象进行操作:产生一个新的对象空间,不是值传递

传递可变对象的操作:

b=[20,30]

def func(m):
    print("m:",id(m))
    m.append(40)

func(b)
print("b:",id(b))
print(b)
#b和m的id地址是一样的

5、传递不可变对象

数字,字符串,元组,布尔值都是不可变对象

a=100

def func(m):
    print("m:",id(m))
    m=m+200
    print("m:", id(m))
    print(m)

func(a)
print("a:",id(a))
print(a)
#产生了一个新的对象,但a的值是不变的

6、浅拷贝和深拷贝

浅拷贝:copy,不拷贝子对象的内容,只是拷贝子对象的引用

深拷贝:deepcopy,会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象

测试浅拷贝和深拷贝:

浅拷贝:

import copy
a=[10,20,[5,6]]
b=copy.copy(a)
print("a:",a)
print("b:",b)

b.append(30)
b[2].append(7)
print("浅拷贝:")
print("a:",a)
print("b:",b)

#append的结果没有改变a,b[2].append改变了a的列表元素

深拷贝:

import copy
a=[10,20,[5,6]]
b=copy.deepcopy(a)
print("a:",a)
print("b:",b)

b.append(30)
b[2].append(7)
print("深拷贝:")
print("a:",a)
print("b:",b)

#深拷贝不会改变源对象

7、参数的传递:不可变对象含可变对象

传递不可变对象是浅拷贝

#传递不可变对象时,如果发生拷贝,是浅拷贝
a=(10,20,[5,6])
print("a:",id(a))

def test(m):
    print("m:",id(m))
    m[2][0]=888
    print(m)
    print("m:", id(m))

test(a)
print(a)

是可以修改不可变对象中的可变对象的

8、参数的类型

1)位置参数:函数调用时,实参按照默认顺序传递,个数必须匹配,按位置传递的参数,成为“位置参数”。

2)默认值参数:为某些参数设置默认值,如果不传,值是默认的,传递时按传递设置的值。默认值必须位于普通位置参数后面。

3)命名参数:按照形参的名称传递函数,位置不做要求。

9、可变参数

1)*param:将多个参数收集到一个元组

2)**param:将多个参数收集到一个字典中

def f1(a,b,*c):
    print(a,b,c)
f1(8,9,10,20,30)

def f2(a,b,**c):
    print(a,b,c)

f2(8,9,name="lixuan",age=18,)

10、强制命名参数

在带星号的可变参数后面增加新的参数,必须是强制命名参数,不然星号无法正确扫描到需要放入元组的元素。

def f1(*a,b,c):
    print(a,b,c)

f1(2,3,4,5,b=2,c=4)

11、lambda表达式

用来声明匿名函数,只允许包含一个表达式,不能包含复杂语句

lambda arg1,arg2,arg3:表达式

g=[lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](4),g[2](10))

12、eval()函数

功能:将str当成右有效表达式计算

s="print('abcdef')"
eval(s)
a=10
b=20
c=eval("a+b")
print(c)
dict=dict(a=200,b=400)
d=eval("a+b",dict)
print(d)

13、递归函数

1)概念:自己调用自己的函数

2)组成:终止条件+递归步骤

在处理大量数据时,会占用很大的内存,谨慎使用

def fun1():
    print("1")
    fun2()
def fun2():
    print("2")
#fun1()


def test01(n):
    print("01:",n)
    if n<=0:
        print("over")
        return 0
    else:
        test01(n-1)
    print("01是",n)


test01(10)

最里层的函数结束完,其他函数会按照层级依次结束

14、阶乘计算案例

def func(n):
    if n==1:
        return 1
    else:
        return n*func(n-1)
func(5)
print(func(5))
标签:

未经允许不得转载:作者:1411-李同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《2020-11-12 函数》 发布于2020-11-12

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

Q Q 登 录
微 博 登 录