title: python-语法笔记
date: 2017-03-24 22:10:39
tags: “Python”
categories: “Python”
python语法学习笔记
前言
不定期更新python里重要的和特色的语法规则。
set,dict
- str,tuple是不变对象,而list是可变对象。
- 和list比较,dict有以下几个特点:
1.查找和插入的速度极快,不会随着key的增加而变慢;
2.需要占用大量的内存,内存浪费多。
而list相反:
1.查找和插入的时间随着元素的增加而增加.
2.占用空间小,浪费内存很少 - set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。
函数
- 函数体内部可以用return随时返回函数结果;
- 函数执行完毕也没有return语句时,自动return None。
- 函数可以同时返回多个值,但其实就是一个tuple。
def MM(s=[]):
# 返回集合里最大值,最小值
max_ans=s[0];min_ans=s[0];
for i in s:
max_ans=max(max_ans,i);min_ans=min(min_ans,i);
return max_ans,min_ans
默认参数
- 一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
- 二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。 - 使用默认参数有什么好处?最大的好处是能降低调用函数的难度。
- 定义默认参数要牢记一点:默认参数必须指向不变对象!
可变参数
- 函数的参数个数实际上也可以是可变的,仅仅在参数前面加了一个*号,但是再函数内部实际上接收到的是一个tuple。
关键字参数
- 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:
def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw);
person('Michael',30);
person('Bob',35,city='Beijing');
person('Adam',45,gender='M',job='Engineer',);
输出:
name: Michael age: 30 other: {}
name: Bob age: 35 other: {'city': 'Beijing'}
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
命名关键字参数
- 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数.
如果要限制关键字参数的名字,就可以用命名关键字参数,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
print(name, age, city, job)
> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
- 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了,这是因为按照参数顺序,可变参数后面只能是命名关键字参数和关键字参数:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
最神奇的是通过一个tuple和dict,你也可以调用上述函数:
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
-
所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
小结 -
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
-
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
-
要注意定义可变参数和关键字参数的语法:
-
*args是可变参数,args接收的是一个tuple;
-
**kw是关键字参数,kw接收的是一个dict。
-
以及调用函数时如何传入可变参数和关键字参数的语法:
-
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3));
-
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’: 2})。
-
使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
8 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
- 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。