跳至主要內容

函数

yczha大约 4 分钟python基础python语法python

Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程open in new window

定义函数

函数格式 def Fun_name():

示例:新建一个文本文件,命名为 my_abs.py,在文件中写入以下内容

def my_abs(x):
  if x>=0:
    return x
  else:
    return -x

调用函数

导入函数 from my_abs import my_abs,注意:第一个my_abs代表.py文件名称,第二个则代表函数名称

空函数

定义一个什么也不做的函数使用pass语句

def nop():
    pass

空函数的作用:可以先让程序运行起来而后续再来添加函数内容

一个实例: 求解一元二次方程函数

#calculate the result of an equtation
import math
def getAns(a,b,c):
  delta=b*b-4*a*c
  if delta<0:
    return '无解'
  else:
    return (-b+math.sqrt(delta))/(2*a),(-b-math.sqrt(delta))/(2*a)

函数的参数

一般的,给函数传递参数采用这样的格式 fun(x,y,z,..),也可以为参数指定默认参数,如stu(name,age,gender='boy')

可变参数

可变参数指的是传入的参数个数可变,比如,计算下式:i=1ni2,我们希望对于不同的n值都可以使用一个函数完成,此时一个可行的方案是你给函数传入数组,比如:

def getResult(num):
  sum=0
    for n in num:
        sum=sum+n*n
    return sum

使用tuple(或者list)调用,需要先把数据组装为tuple或者list

num=(1,2,3,4,5)
getResult(num)

当然,python支持多参数函数的直接定义,仅需在参数名前加一个*符号即可:

def getResult(*num):
  sum=0
    for n in num:
        sum=sum+n*n
    return sum

此时,你便可以这样调用:

getResult(1,2,3,4,5...)

若要在可变参数函数中传入tuple或者list对象,只需在此基础上添加*即可

num=[1,2,3,4,5]
getResult(*num)

关键字参数

关键字参数允许用户传入包含任意个参数名的参数,在内部自动组装为一个dict,示例如下:

def stu(name,age,**kw):
  print('name',name,'age',age,'other',kw)

上面的实例中,stu函数除了接收必选参数nameage外,还接受关键字参数kw。调用时,你可只传入必选参数:

>>>stu('Mark',18)
name Mark age 18 other {}

也可以传入任意多个参数:

>>> stu('Mark',18,gender='male',id=12345)
name Mark age 18 other {'gender': 'male', 'id': 12345}

或者传入一个额外的dict:

>>> dic={'city':'Beijing','gender':'male'}
>>> stu('Bob',18,**dic)
name Bob age 18 other {'city': 'Beijing', 'gender': 'male'}

你也可以限定所传入的参数名:

def stu(name,age,*,city,gender):
    print('name:',name,'age:',age,'other:',city,gender)

调用这样的关键字参数必须指定参数名称:

>>> stu('Bob',18,city='Shanghai',gender='male')
name: Bob age: 18 Shanghai male

递归函数

在函数内部调用自身的函数为递归函数,递归函数可简化代码,使程序流程清晰。

示例:通过递归函数实现:n!=n*(n-1)*...*2*1,使用递归的思想表达即为:f(n)=n*f(n-1)=n*(n-1)*f(n-2)=...

def factorial(n):
    if n==1:
        return 1
    else:
        return n*factorial(n-1)

调用上述函数:

>>> factorial(2)
2
>>> factorial(7)
5040
>>> factorial(10)
3628800
>>> factorial(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

示例2:汉诺塔问题open in new window。也是一个经典的递归解决的问题,其基本要求是这:现有n个大小各不相同的盘子由大到小从下往上放在第一根柱子(A)上,要求通过中间柱子(B)将盘子移动到第三根柱子(C)上,也为由大到小从下到上排列。要求每次只能移动一个盘子且需保证任何时候任何柱子上的盘子都是由大到小从下到上排列,求出移动的最少步骤。

这个问题可理解为:将第n-1个盘子移到B上,然后把n移到C上,依次类推。

#汉诺塔问题
def Hanoi(n,a,b,c):
  if n==1:
    print(a,'-->',c)
  else:
    Hanoi(n-1,a,c,b)
    print(a,'-->',c)
    Hanoi(n-1,b,a,c)

调用示例:

>>> Hanoi(2,'A','B','C')
A --> B
A --> C
B --> C
>>> Hanoi(3,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C