如何去定义一个函数:
def condition(age):
if age>18:
print("do what you want it")
elif age<18 and age>6:
print("do something what your parents want it")
else:
print("drink milk in a cradle")
condition(3)
位置参数:(不传就报错)
def power(x) # x就是位置参数
带默认参数的函数:(位置参数必传,默认参数不传取默认值)
def enroll(name, gentle, age=7, city="北京"):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll('Tenro', "带把的")
enroll('Tenro', "带把的", 8)
enroll('Tenro', "带把的", city="湖南")
可变参数的函数:(可传可不传)
#通过传入可变参数去求传入参数的平方和
def enroll(*numbers):
sum = 0
for x in numbers
sum = sun + x * x
print(sum)
enroll(1, 3, 5, 7)
#定义函数参数为*,当传入的是列表或者元祖时候,调用的时候也同样带上*
enroll(*[1, 3, 5, 7])
enroll(*(1, 3, 5, 7))
关键字参数 **kw(位置参数必传,关键字参数可传可不传)
def person(name, age, **kw):
print("name:", name, "age:", age, 'other:', kw)
person('tenro', 28) #双星号代码非必选参数
person('tenro', 28, city = "beijing") #可以自定义内容
person('tenro', 28, city = "beijing", job = "engineer") #支持多组定义内容
extra = {'city': 'shanghai', 'job': 'manager'}
person('tangsen', 32, city = extra['city'], job = extra['job'])
person('tangsen', 32, **extra)
命名关键字参数(位置参数必传,命名关键字参数必须用*分割,除非有可变参数在中间)
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数)
def person(name, age, *, city, job):
print(name, age, city, job)
person('tenro', 28, city='Beijing', job='Engineer')
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job
person('tenro', 28, (12, 34), city='Beijing', job='Engineer')
递归函数及优化
#递归函数(数值过大会导致栈的溢出)
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print(fact(5))
print(fact(1))
print(fact(100))
#优化递归函数(每一次的返回会释放一次栈内存)
def fact(num):
return superFact(num, 1)
def superFact(num, product):
if num == 1:
return product
return superFact(num-1, product*num)
网友评论