Python学习-Day5-函数(二)

1026-徐同学

发表文章数:41

首页 » Python » 正文

函数也是对象,内存底层分析

def test01():
    print("Man")
test01()
c = test01
c()

Man
Man

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

Python学习-Day5-函数(二)

a = 3
def test01():
    b = 4
    print(b)
    a = 300
    print(a)
test01()
print(b)
print(a)

Traceback (most recent call last):
  File "C:/Users/admin/PycharmProjects/turtle/test.py", line 8, in <module>
    print(b)
NameError: name 'b' is not defined
4
300

Python学习-Day5-函数(二)
print(locals()) 打印输出的局部变量

局部变量和全局变量效率测试

Python学习-Day5-函数(二)
Python学习-Day5-函数(二)

参数的传递

从实参到形参的赋值操作。
对可变对象进行写操作,直接作用于原对象本身。
对不可变对象进行写操作,会产生一个新的对象空间,并用新的值填充这块空间。
可变对象:字典、列表、集合、自定义的对象等。
不可变对象:数字、字符串、元组、function等

传递可变对象的引用

传递参数是可变对象,实际传递的还是对象的引用。

a = [10,20]
print(id(a))
print(a)
def test01(m):
    print(id(m))
    m.append(300)
    print(id(m))
test01(a)
print(a)

1780838125960
[10, 20]
1780838125960
1780838125960
[10, 20, 300]

传递不可变对象的引用

参数是不可变对象,实际传递的还是对象的引用。在赋值操作时,由于不可变对象无法修改,系统会新创建一个对象。

a = 100
def f1(n):
    print("n:",id(n))
    n=n+200
    print("n:",id(n))
    print(n)
f1(a)
print("a",id(a))

n: 140713297817072
n: 1785365939024
300
a 140713297817072

浅拷贝和深拷贝

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)

a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
浅拷贝
a: [10, 20, [5, 6, 7]]
b: [10, 20, [5, 6, 7], 30]
#深拷贝
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)

a: [10, 20, [5, 6]]
b: [10, 20, [5, 6]]
深拷贝
a: [10, 20, [5, 6]]
b: [10, 20, [5, 6, 7], 30]

传递不可变对象是浅拷贝

a = 10

print("a:",id(a))

def test01(m):
    print("m:",id(m))
    m=20
    print(m)
    print("m:",id(m))

test01(a)

a: 140713297814192
m: 140713297814192
20
m: 140713297814512

不可变对象含可变子对象

传递不可变对象时,不可变对象里面包含的子对象是可变的,则方法内修改了这个可变对象,原对象也发生了改变。

a = (10,20,[5,6])
print("a:",id(a))

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

a: 2608197209608
m 2608197209608
(10, 20, [888, 6])
m 2608197209608
(10, 20, [888, 6])

参数的类型

位置参数

函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。

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

f1(2,3,4)
fi(2,3)

2 3 4
Traceback (most recent call last):
  File "C:/Users/admin/PycharmProjects/turtle/test.py", line 5, in <module>
    fi(2,3)
NameError: name 'fi' is not defined

默认值参数

为某些参数设置默认值,这样这些参数在传递时就是可选的。默认值参数必须位于其他参数后面。

def f1(a,b,c=10,d=20):
    print(a,b,c,d)

f1(2,3)
f1(2,3,10)
f1(2,3,10,11)

2 3 10 20
2 3 10 20
2 3 10 11

命名参数

按照形参的名称传递参数,也叫关键字参数。

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

f1(2,3,10)
f1(c=2,b=3,a=4)

2 3 10
4 3 2

可变参数

可变参数指的是“可变数量的参数”,两种情况。

  1. *param(一个星号),将多个参数收集到一个元组对象中。
  2. **param(两个星号),将多个参数收集到一个字典对象中。
def f1(a,b,*c):
    print(a,b,c)

f1(2,3,10,20)
def f2(a,b,**c):
    print(a, b, c)

f2(8,9,name = 'Man',age = 10)
def f3(a,b,*c,**d):
    print(a,b,c,d)

f3(8,9,20,30,name = 'Man',age = 10)

2 3 (10, 20)
8 9 {'name': 'Man', 'age': 10}
8 9 (20, 30) {'name': 'Man', 'age': 10}

强制命名参数

在带星号的“可变参数”后面增加新的参数,必须是“强制命名参数”
Python学习-Day5-函数(二)

lambda表达式和匿名函数

Python学习-Day5-函数(二)

f =lambda a,b,c,d:a*b*c*d
def test(a,b,c,d):
    return a*b*c*d

print(f(2,3,4,5))

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

h = [test,test]
print(h[0](3,4,5,6))

120
12
360

eval()函数

Python学习-Day5-函数(二)

s = "print('abc')"
eval(s)

a = 10
b = 20
c = eval("a+b")
print(c)
dict1 = dict(a=100,b=200)
d = eval("a+b",dict1)
print(d)

abc
30
300

递归函数

自己调用自己的函数。
Python学习-Day5-函数(二)

def test1(n):
    print("test01",n)
    if n == 0:
        print("over")
    else:
        test1(n-1)
    print("test1***",n)

test1(4)

test01 4
test01 3
test01 2
test01 1
test01 0
over
test1*** 0
test1*** 1
test1*** 2
test1*** 3
test1*** 4

递归计算阶乘

def factorial(n):
    if n ==1:
        return 1
    else:
        return n*factorial(n-1)

result = factorial(5)
print(result)

120

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

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

Q Q 登 录
微 博 登 录