Day6

函数也是对象

#Python 中一切皆对象
def print_star(n):
    print("*"*n)
print(print_star)
print(id(print_star))

c =print_star
c(5)

结果:

<function print_star at 0x0000021B716A2F78>
2316890156920
*****

内存分析:
Day6_第1张图片

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

全局变量:

  1. 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。
  2. 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
  3. 全局变量一般做常量使用。
  4. 函数内要改变全局变量的值,使用 global 声明一下

局部变量:

  1. 在函数体中(包含形式参数)声明的变量。
  2. 局部变量的引用比全局变量快,优先考虑使用。
  3. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量

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

import math
import time

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

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

test1()
test2()

结果:

耗时:1.387796401977539
耗时:1.003021478652954

浅拷贝和深拷贝

浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用, 使用copy()方法。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象, 使用deepcopy()方法,


import copy

def testCopy():
    a = [10,20,[30,40]]
    b = copy.copy(a)
    print("a:",a)
    print("b:",b)
    b.append(50)
    b[2].append(60)
    print("浅拷贝测试结果为:")
    print("a:",a)
    print("b:",b)

def testDeepCopy():
    a = [10,20,[30,40]]
    b = copy.deepcopy(a)
    print("a:",a)
    print("b:",b)
    b.append(50)
    b[2].append(60)
    print("深拷贝测试结果为:")
    print("a:",a)
    print("b:",b)
print('**********************************')
testCopy()
print('**********************************')
testDeepCopy()

结果:

**********************************
a: [10, 20, [30, 40]]
b: [10, 20, [30, 40]]
浅拷贝测试结果为:
a: [10, 20, [30, 40, 60]]
b: [10, 20, [30, 40, 60], 50]
**********************************
a: [10, 20, [30, 40]]
b: [10, 20, [30, 40]]
深拷贝测试结果为:
a: [10, 20, [30, 40]]
b: [10, 20, [30, 40, 60], 50]

传递不可变对象包含的子对象是可变的情况

#以元组中有列表对象为例
a = (1,3,[5,7])
print("a:",id(a))
def test(m):
    print("m:",id(m))
    m[2][0] = 666
    print(m)
    print("m:",id(m))
    
test(a)
print(a)

结果:

a: 2367543250760
m: 2367543250760
(1, 3, [666, 7])
m: 2367543250760
(1, 3, [666, 7])

函数的可变参数

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

  1. *param(一个星号),将多个参数收集到一个“元组”对象中。
  2. **param(两个星号),将多个参数收集到一个“字典”对象中。
#元组
def f1(a,b,*c):
    print(a,b,c)
f1(1,2,3,4)
#字典
def f2(a,b,**c):
    print(a,b,c)
f2(1,2,name="Yuehai",age=20)

结果:

1 2 (3, 4)
1 2 {
     'name': 'Yuehai', 'age': 20}

lambda表达式和匿名函数

例:lambda表达式的使用:

f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))

结果:

<function <lambda> at 0x0000017F53692F78>
9

eval()函数

功能:将字符串 str 当成有效的表达式来求值并返回计算结果。
语法: eval(source[, globals[, locals]]) -> value
参数:
source:一个 Python 表达式或函数 compile()返回的代码对象 。
globals:可选。必须是 dictionary。
locals:可选。任意映射对象。

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

递归函数

  1. 终止条件 表示递归什么时候结束。一般用于返回值,不再调用自己。
  2. 递归步骤 把第 n 步的值和第 n-1 步相关联。

例:使用递归计算阶乘

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

for i in range(1,6):
    print(i,"!=",factotial(i))

结果:

1 != 1
2 != 2
3 != 6
4 != 24
5 != 120

你可能感兴趣的