Day 6 :参数,变量,函数

1249-刘同学

发表文章数:59

首页 » Python » 正文

2020/8/27

函数调用的底层

调用方法的时候 其实就是调用已经创造好的对象。调用的时候不会新键对象

在堆里面建立一个对象,在栈里面也保存了一个变量,这个值就是对象的地址
()就是调用
Day 6 :参数,变量,函数

def test():
    print("sxtsxt")
test01()
c = test01
#c 把test01的值一样 ,调用c 的时候就找到对应的对象 

变量的作用域

变量起作用的范围称作变量的作用域;不同的作用域内 同名变量之间不影响。变量分为全局变量,局部变量。
全局变量:(globals())

  1. 在函数和类定义之外声明的变量,作为域为定义的模块,从定义位置开始直到模块结束
  2. 全局变量降低了函数的通用性 和可读性。尽量避免使用全局变量
  3. 全局变量一般用于常量
  4. 函数内要改变全局变量的值 用global声明
    局部变量(locals())
  5. 在函数体内声明的变量
  6. 局部变量比全局变量引用快,所以说优先考虑局部变量
  7. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只用局部变量。如果要使用 需要global声明一下
    Day 6 :参数,变量,函数

在调用局部变量的时候 会有一个栈帧(stack frame),栈帧可以访问外面,但是不能外面访问里面。并且栈帧被调用结束后 就会被删除。

能使用局部变量就尽量使用局部变量

参数的传递

python 中的参数的传递都是“引用传递”,而不是值传递

  1. 对于可变对象,就进行写操作, 直接作用于对象本身(字典,列表,集合,自定义对象等)
  2. 对于不可变对象,进行写操作,会产生一个新的对象空间,并用新的值填入这块空间(数字,字符串,元组,function等)
a = [10, 20]


def text0(t):
    print(id(t))
    t.append(300)`
    print(id(t))
    

text0(a)
print(a)

Day 6 :参数,变量,函数

传递不可变对象的引用,会创建一个新对象

Day 6 :参数,变量,函数

浅拷贝和深拷贝

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

a = [10,20,30,[5,6]]
b = copy.copy(a)
c = copy.deepcopy(a)

print("a",a)
print("b",b)

b.append(30)
b[3].append(7)
print("浅拷贝")

print("a",a)

Day 6 :参数,变量,函数
深拷贝
Day 6 :参数,变量,函数
参数的传递 其实就是浅拷贝

参数的几种类型

位置参数:通过位置确定的参数,通过个数和形参匹配

def f1(a,b,c)
    print("{0},{1},{2}".format(a,b,c))

f1(10,20,30)

默认值参数:我们在定义形参的时候,可以提前定义参数的值,这样在后面传入值的话 就是新传的值。默认值参数要放普通参数后面后面

def f1(a,b,c=30)
    print("{0},{1},{2}".format(a,b,c))

f1(10,20)

命名参数:可以通过名字来匹配形参。

def f1(a,b,c)
    print("{0},{1},{2}".format(a,b,c))

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

可变参数:
用一个* 储存参数变为元组
用2个* 储存参数变为字典

def f1(a,b,*c)
    print("{0},{1},{2}".format(a,b,c))

f1(10,20,3040)


def f1(a,b,**c)
    print("{0},{1},{2}".format(a,b,c))

f1(10,20,name = "jack", age = 18)

强制命名参数
如果*号在前面的话 那么只能用命名方法 来为形参命名

def f1(*a,b,c)
    print("{0},{1},{2}".format(a,b,c))

f1(234, b=20,c= 40)

lambda 表达式和匿名函数

iambda 表达式可以用来声明匿名,是一种简单的,在同一行中定义函数的方法。lambda 函数实际生成了一个函数对象
lambda 一个空格 arg1 arg2 : 表达式

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

h = f(123print(g)

eval()函数

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

递归函数

自己调用自己的函数,
要有终止符号,第n个和n-1 中间要有联系

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


test01(4)

Day 6 :参数,变量,函数
使用递归 计算阶乘

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

Day 6 :参数,变量,函数

拜师教育学员文章:作者:1249-刘同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《Day 6 :参数,变量,函数》 发布于2020-08-27

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

Q Q 登 录
微 博 登 录