函数的定义及参数详解

2018-09-03  本文已影响0人  tenro

如何去定义一个函数:

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)
上一篇 下一篇

猜你喜欢

热点阅读