函数_全局变量和局部变量_参数传递_拷贝_lambda_eval_递归

1430-王同学

发表文章数:21

热门标签

首页 » Python » 正文

函数也是对象

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

print(id(test01))
print(id(c))
print(type(c))
#运行结果
sxtsxt
sxtsxt
1607912118880
1607912118880
<class 'function'>

全局变量和局部变量

全局变量:作用域为定义的模块

  • 降低了函数的通用性和可读性
  • 函数内要global声明一下
    局部变量:函数内部
  • 在函数体中使用,优先考虑使用
  • 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
a = 3 #全局变量
def test01():
    b = 4 #局部变量
    print(b*10)
    print(locals()) #打印输出局部变量
    print(globals())#打印输出全局变量
test01()
test01()
print(a)

局部变量和全局变量效率分析

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()

参数的传递

从实参到形参的赋值操作

可变对象:字典、集合、自定义的对象
不可变对象:数字、字符串、元组、function

传递可变对象

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

test01(a)
print(a)
#运行结果
1478018851136
[10, 20]
***********
1478018851136
1478018851136
[10, 20, 300]

传递不可变对象

a = 100
print('a:',id(a))
def f1(n):
    print('n:',id(n))
    n = n+200       #由于a是不可变对象,因此创建新的对象n
    print('n:',id(n))
    print(n)
f1(a)
print('a:',id(a))
#运行结果
a: 140732195685248
n: 140732195685248
n: 3087990360400
300
a: 140732195685248

浅拷贝和深拷贝

浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响原对象

import copy
def testCopy():
    a = [10, 20, [5, 6]]
    b = copy.copy(a)
    b.append(30)
    b[2].append(7)
    print("浅拷贝*******")
    print("a:", a)
    print("b:", b)
def testDeepCopy():
    a = [10, 20, [5, 6]]
    b = copy.deepcopy(a)
    b.append(30)
    b[2].append(7)
    print("深拷贝*******")
    print("a:", a)
    print("b:", b)
testCopy()
testDeepCopy()
#运行结果
浅拷贝*******
a: [10, 20, [5, 6, 7]]
b: [10, 20, [5, 6, 7], 30]
深拷贝*******
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: 140732177266752
m: 140732177266752
20
m: 140732177267072

参数

#位置参数
def f1(a,b,c):
    print(a,b,c)
f1(2,3,4)

#默认值参数
def f1(a,b,c=10,d=20): #默认参数必须在普通参数后面
    print(a,b,c,d)
f1(8,9)
f1(8,9,19)

#命名参数
def f1(a,b,c):
    print(a,b,c)

f1(8,9,10)
f1(c=10,a=20,b=30)

#运行结果
2 3 4
8 9 10 20
8 9 19 20
8 9 10
20 30 10

可变参数
1个*,将多个参数收集到一个‘元组’对象中
2个*,将多个参数收集到一个‘字典’对象中

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

f1(8,9,19,20)

def f2(a,b,**c):
    print(a,b,c)
f2(8,9,name='wy',age=180)

def f3(a,b,*c,**d):
    print(a,b,c,d)

f3(8,9,20,30,name='wy',age=18)
#运行结果
8 9 (19, 20)
8 9 {'name': 'wy', 'age': 180}
8 9 (20, 30) {'name': 'wy', 'age': 18}

强制命名参数
在带星号的“可变参数”后面增加新的参数,必须是“强制命名参数”

def f1(*a,b,c):
	print(a,b,c)
print()
f1(2,b=3,c=4)

lambda表达式和匿名函数

  • 实际生成一个函数对象
  • 只允许包含一个表达式,不能包括复杂语句
  • 表达式结果可以作为函数返回值
    lambda arg1,arg2,… : <表达式>
f = lambda a,b,c,d:a*b*c*d
print(f)
print(f(2,3,4,5))

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

eval()函数

  • 将字符串str当成有效的表达式来求值并返回计算结果
  • eval(source[,globals[,locals]]) -> value
    1 source :一个表达式或函数
    2 globals : 必须是字典
    3 locals: 可选,任意映射对象
s = "print('abcd')"
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)

递归函数

*自己调用自己的函数

def test01(n):
    print("test01",n)
    if n==0:
        print("over")
    else:
        test01(n-1)
    print("test01****",n)
def test02():
    print("test02")
test01(4)
#运行结果
test01 4
test01 3
test01 2
test01 1
test01 0
over
test01**** 0
test01**** 1
test01**** 2
test01**** 3
test01**** 4  #最先调用的最后被执行

阶乘计算实例

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

未经允许不得转载:作者:1430-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《函数_全局变量和局部变量_参数传递_拷贝_lambda_eval_递归》 发布于2020-11-23

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

Q Q 登 录
微 博 登 录