Day6.

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

def g_test01():
    print(2)


g_test01()
c = g_test01
c()

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

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

a = 3  # 全局变量


def Global_test():
    b = 4  # 局部变量
    global a  # 如果要在函数中改变全局变量的值使用global
    a = 300
    print(locals())  # 打印局部变量
    print(globals())  # 打印全局变量(字典)


Global_test()

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

局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其在循环的时候

在特别强调效率的地方或者循环次数较多的地方,可以将全局变量转变为局部变量提高运行速度

import math
import time


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


def g_test02():
    b = math.sqrt
    start = time.time()
    for j in range(1000000):
        b(30)
    end = time.time()
    print('耗时{0}'.format(end - start))


g_test01()
g_test02()

参数的传递:函数的参数传递本质上是从实参到形参的赋值参数

python中一切皆对象,所有的赋值操作都是引用的赋值,参数的传递都是引用传递,不是值传递

可变对象:字典列表,集合,自定义对象等

传递可变对象

a = [10, 20]


def g_test01(m):
    print(id(m))
    m.append(30)
    print(id(m))


g_test01(a)

不可变对象:数字,字符串,元组,function等

a = 100


def G_test(n):
    print('n', id(n))
    n = n + 100
    print('n', id(n))


G_test(a)

浅拷贝和深拷贝

内置函数:copy(浅拷贝)deepcopy(深拷贝) 

浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用,修改涉及到子对象,子对象一起修改

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

# 浅拷贝
a = [10, 20, [5, 6]]
b = copy.copy(a)
print(a)
print(b)

b.append(30)
b[2].append(7)  # 对子对象内容的修改影响源对象
print(a)
print(b)

# 深拷贝
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)

b.append(30)
b[2].append(7)  # 对子对象内容修改不影响源对象
print(a)
print(b)

参数传递不可变对象含可变对象

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


def G_test(m):
    print('m:', id(m))
    m[2][0] = 888
    print(m)
    print(m, id(m))


G_test(a)

参数的几种类型

位置参数:需要个数和形参匹配,按位置传递参数

默认值参数:我们可以将某些参数设置默认值,这样这些参数在传递时就是可选的,成为‘默认值参数’,默认值参数必须在其他参数后面

命名参数:通过形参名称来匹配

def f1(a, b, c, d):
    print('{0}-{1}-{2}-{3}'.format(a, b, c, d))


f1(10, 20, 30, 40)  # 位置参数,个数不匹配报错
f1(d=15, b=100, a=10, c=11)  # 命名参数,通过形参名称来匹配


def f2(a, b, c=10, d=15):  # 默认参数必须位于其他参数后面
    print('{0}-{1}-{2}-{3}'.format(a, b, c, d))


f2(1, 3, 4)

可变参数

1.一个星号,将多个参数收集到一个元组对象中

2.两个星号,将多个参数收集到一个字典对象中

星号后添加参数必须定义命名参数

def f1(a, b, *c):  # 元组
    print('{0}-{1}-{2}'.format(a, b, c))


f1(1, 2, 3, 4, 5)


def f2(a, b, *d, **c):  # 元组必须在字典之前
    print('{0}-{1}-{2}-{3}'.format(a, b, d, c))


f2(1, 2, name='zf', age=18)


def f3(*a, b, c): #可变参数后面增加新参数必须定义为命名参数
    print('{0}-{1}-{2}'.format(a, b, c))


f3(1, 2, b=3, c=4)

lambda表达式和匿名函数

f = lambda a, b, c, d: a * b * c * d
print(f(1, 2, 3, 4))

f1 = [lambda a: a * 2, lambda b: b * 3]
print(f1[0](2), f1[1](3))

eval函数

将字符串str当成有效表达式来求值并返回计算结果

语法eval(source,globals,locals)

source:一个python表达式或者函数

globals:可选必须是字典dict

locals:任意映射对象

eval('print("hello")')
a = 10
b = 20
print(eval('a+b'))

dict1 = dict(a=100, b=200)
d = eval('a+b', dict1)
print(d)

递归函数

def g_test01(n):
    print('g_test01:', n)
    if n == 0:
        print('over')
    else:
        g_test01(n - 1)

    print('g_test01****', n)


g_test01(4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值