2021-05-27

第十一周Python笔记

函数:
1.在编写函数时,应尽量减少副作用,尽量不要修改参数本身,不要修改除返回值以外的其他内容。
2.函数定义语法:
def 函数名([参数列表]):
‘’‘注释’’’
函数体
3.注意事项
(1)函数形参不需要声明类型,也不需要指定函数返回值类型
(2)即使该函数不需要接收任何参数,也必须保留一对空的圆括号
(3)括号后面的冒号必不可少
(4)函数体相对于def关键字必须保持一定的空格缩进
(5)Python允许嵌套定义函数
4.函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再调用自己,自己再调用自己,当某个条件得到满足的时候就不再调用了,然后再一层一层地返回直到该函数第一次调用的位置。
5.函数定义时括弧内为形参,一个函数可以没有形参,但是括弧必须要有,表示该函数不接受参数。函数调用时向其传递实参,将实参引用传递给形参。在定义函数时,对参数个数并没有限制,如果有多个形参,需要使用逗号进行分隔。
6.如果传递给函数的实参是可变序列,并且在函数内部使用下标或可变序列自身的方法增加、删除元素或修改元素时,实参也得到相应的修改。
7.Python在定义函数时不需要指定形参的类型,完全由调用者传递的实参类型以及Python解释器的理解和推断来决定,类似于重载和泛型。
8.位置参数是比较常用的形式,调用函数时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。
默认值参数如果使用不当,会导致很难发现的逻辑错误,例如:
def demo(newitem,old_list=[]):
old_list.append(newitem)
return old_list
print(demo(‘5’,[1,2,3,4])) #right
print(demo(‘aaa’,[‘a’,‘b’])) #right
print(demo(‘a’)) #right
print(demo(‘b’)) #wrong
上面的代码输出结果如下,最后一个结果是错的。

[1, 2, 3, 4, ‘5’]
[‘a’, ‘b’, ‘aaa’]
[‘a’]
[‘a’, ‘b’]
原因在于默认值参数的赋值只会在函数定义时被解释一次。当使用可变序列作为参数默认值时,一定要谨慎操作。
解决方案:改成下面的样子就不会有问题了

def demo(newitem,old_list=None):
if old_list is None:
old_list=[]
new_list = old_list[:]
new_list.append(newitem)
return new_list

print(demo(‘5’,[1,2,3,4]))
print(demo(‘aaa’,[‘a’,‘b’]))
print(demo(‘a’))
print(demo(‘b’))
9.默认值参数只在函数定义时被解释一次
可以使用“函数名.defaults”查看所有默认参数的当前值
10.通过关键参数,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦。

def demo(a,b,c=5):
print(a,b,c)

demo(3,7)
3 7 5

demo(a=7,b=3,c=6)
7 3 6

demo(c=8,a=9,b=0)
9 0 8

11.可变长度参数主要有两种形式:在参数名前加1个*或2个**
*parameter用来接收多个位置实参并将其放在一个元组中
**parameter接收多个关键参数并存放到字典中
*parameter的用法

def demo(*p):
print§

demo(1,2,3)
(1, 2, 3)

demo(1,2)
(1, 2)

demo(1,2,3,4,5,6,7)
(1, 2, 3, 4, 5, 6, 7)

**parameter的用法

def demo(**p):
for item in p.items():
print(item)

demo(x=1,y=2,z=3)
(‘y’, 2)
(‘x’, 1)
(‘z’, 3)

12.传递参数时,可以通过在实参序列前加一个星号将其解包,然后传递给多个单变量形参。
13.如果函数实参是字典,可以在前面加两个星号进行解包,等价于关键参数。
14.调用函数时对实参序列使用一个星号*进行解包后的实参将会被当做普通位置参数对待,并且会在关键参数和使用两个星号**进行序列解包的参数之前进行处理。
15.return语句用来从一个函数中返回一个值,同时结束函数。
对于以下情况,Python将认为该函数以return None结束,返回空值:
函数没有return语句;
函数有return语句但是没有执行到;
函数有return但是没有返回任何值。
在调用函数或对象方法时,一定要注意有没有返回值,这决定了该函数或方法的用法。
16.变量起作用的代码范围称为变量的作用域,不同作用域内变量名可以相同,互不影响。
在函数内部定义的普通变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不再可以使用。
局部变量的引用比全局变量速度快,应优先考虑使用。
17.全局变量可以通过关键字global来定义。这分为两种情况:
一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,可以在函数内使用global将其声明为全局变量。
如果一个变量在函数外没有定义,在函数内部也可以直接将一个变量定义为全局变量,该函数执行后,将增加一个新的全局变量。
18.在某个作用域内任意位置只要有为变量赋值的操作,该变量在这个作用域内就是局部变量,除非使用global进行了声明。
19.如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内隐藏同名的全局变量。
20.除了局部变量和全局变量,Python还支持使用nonlocal关键字定义一种介于二者之间的变量。关键字nonlocal声明的变量会引用距离最近的非全局作用域的变量,要求声明的变量已经存在,关键字nonlocal不会创建新变量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值