函数
函数的参数
def power(x):#其中的x就是位置参数
return x*x
默认参数:
def power(x,n=2):#其中n=2是默认值
s=1
while n>0:
n=n-1
s=s*x
return s
print(power(2,3))#其中3这个参数如果不传入,那么就会默认为2
这里需要注意的是,默认参数必须放在必选参数(例如本函数的x)的后面;而且,默认参数必须指向不变对象!!
可变参数:
由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:
def calc(a):#将参数用list或者tuple传进来
sum=0
for n in a:
sum=sum+n*n
return sum
print(calc([1,2,3]))#结果是打印:14
当然,我们也可以不传入list或者tuple,此时只需要在参数前面加一个*号,这是参数就可以传入一个或者多个。例如:
def calc_1(*c):
sum=0
for m in c:
sum=sum+m*m
return sum
print(calc_1(1,2,3))#结果是打印:14
此时参数不能再传入list或者tuple,但是可以在list或者tuple前面加一个*,将其元素变成可变参数
关键字参数:
#关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。例如:
def person(name,age,**kw):
print('nmae:',name,'age:',age,'other:',kw)
datas={'city':'beijin','jod':'student'}
person('John',18,**datas)
**表示定义关键字参数,在dict前加**表示将这个dict的元素变成关键字参数传入
命名参数:
命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
def person_1(name,age,*,city,job):
print(name,age,city,job)
person_1('jack',24,city='beijing',job='student')#除了city和job,其他的都无法被传入
命名参数传入时必须带上参数名,否则会报错
参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
递归函数
递归函数即函数内部调用本身。例如
def fact(n):#计算阶乘n!
if n==1:
return 1
return n*fact(n-1)#在此处调用本身
print(fact(10))
高级特性
切片
#对这种经常取指定索引范围的操作,用循环十分繁琐,
#因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
L=[1,2,3,4,5]
print(L[0:3])#从零开始索引,到3结束,但是不包括3
print(L[1:3])
print(L[-2:-1])#倒数切片
L1=list(range(50))#创建一个[0,50)的list
print(L1[:10:2])#每十个数,每两个取一个
print(L1[::2])#所有的数,每五个取一个
print(L1[:])#表示原样复制一个L1
print('ABCDEFG'[:3])#字符串也可以看成一种list
print('ABCDEFG'[::2])#所有的元素每两个取一个
迭代
d={'a':1,'b':2,'c':3}#定义一个dict
for a in d:
print(a)#单纯遍历Key值
for b in d.values():
print(b)#单纯输出values值
for c in d.items():
print(c)#既输出key值,又输出values值
#字符串也可以是迭代对象
#通过collections.abc模块的Iterable类型判断一个对象是否是可迭代对象
from collections.abc import Iterable
print(isinstance('abc',Iterable))#返回true
print(isinstance([1,2,3],Iterable))#返回true
print(isinstance(123,Iterable))#返回false
列表生成式
#列表生成式
print(list(range(1,11)))#生成一个(0,1)范围内的list
List_1=[x*x for x in range(1,11)]#用列表生成式生成一个[1x1,2x2....10x10]的list
print(List_1)
#for循环后面还可以加上if语句
print([x*x for x in range(1,11) if x%2==0])#筛选出仅偶数的平方
#还可以使用两层循环,可以生成全排列:
print([m+n for m in 'ABC' for n in 'XYZ'])
#for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
d={'x':'A','y':'B','z':'C'}
for k,v in d.items():
print(k,'=',v)
#因此,列表生成式也可以使用两个变量来生成list:
[k+'='+v for k,v in d.items()]
print([k+'='+v for k,v in d.items()])
#最后把一个list中所有的字符串变成小写
L=['Hello','World','IBM','Apple']
print([s.lower() for s in L])
#if....else
[x if x%2==0 else -x for x in range(1,11)]
print ([x if x%2==0 else -x for x in range(1,11)])#如果if在for前面,那么必须加else,如果写在for后面则不用加else
#if 在for前面的是表达式,在for后面的是过滤条件
生成器
#在Python中,这种一边循环一边计算的机制,称为生成器:generator。
#第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
g=(x*x for x in range(10))
for a in g:
print(a)#通过遍历输出
def fab(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n+=1
return 'done'
fab(5)#此时fab是一个函数
#fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。
#作出修改
def fibs(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n+=1
return 'done'
f=fibs(5)
for b in f:
print(b)
#将print(b)改成yield b之后,fibs函数就变成一个generator(生成器)函数
#如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator函数,调用一个generator函数将返回一个generator。