Python再学习(四)函数

python 函数

  1. 定义带形参的函数
  2. 用实参来调用函数
  3. 区分带返回值的函数和不带返回值的函数
  4. 使用位置参数和关键字参数调用函数
  5. 开发可重用代码来模块化程序,使程序易读、易调试和维护
  6. 决定变量的作用域
  7. 在软件开发中使用函数抽象的概念
  8. 用逐步求精的方法设计和实现函数
  9. 使用可重用代码简化程序

  

def functionName(list of parameters):
    #别忘了冒号
     function body

几个常见的函数

  • 累加函数
    
#定义累加函数
def sum(i1,i2) :
     result = 0 
    for i in range(i1,i2+1):
        #result 自行加 i 
        result += i 
    return result 
  • 最大值函数
def my_max(a,b):
    if a > b:
        result = a
    else:
        result = b
    return result

👉 带返回值的函数可以当作语句使用,函数返回值会被忽略,比较少见,但是如果函数调用对返回值不敢兴趣,这样也被允许

👉 如果需要调用函数,可以使用 functionName(parameter) 的方式调用。

  • 成绩分级函数,不带返回值
def printGrade(score):  
    if score >= 90:
        print('A')
    elif score >= 80:
        print('B')
    elif score >= 70:
        print('C')
    elif score >= 60:
        print('D') 
    else:
        print('F')
def main():
    score = eval(input('请输入成绩:')) 
    print('The grade is ',end = '') 
    printGrade(score)

  • 成绩分级函数,带返回值
def printGrade(score):  
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D' 
    else:
        return 'F'


def main():
    score = eval(input('请输入成绩:')) 
    print('The grade is ',printGrade(score))

👉带返回值和不带返回值有区别,但是所有 Python 的函数都返回一个值,如果没有返回值,默认情况下,它会返回一个特殊值 None,所以,没有返回值后函数不会返回任何值,所以也被称为 None函数, None 函数可以赋值给一个变量来表明这个变量不指向任何对象。

比如:

def sun(a,b):
    total = a + b 

def main():
    print(sun(1,2))
    

就会返回一个 None。

位置参数和关键字参数

  函数作用是调用函数时将实参传递给形参,实参有两种类型: 位置参数 关键词参数 。使用位置参数要求参数在函数头的顺序进行传递。

def nPrintln(message,n):
    for i in range(n):
        print(message) 

例如,message,会打印参数 message,n次,调用的时候使用 nPrintln('a',3) 会打印 a 字符 3次,但是如果换成 nPrintln(3,'a') 会有不同的意义,它会将 3 传递给 message,把 a 传递给 n ,所以字符,好像页不会蠢到这样写 function 吧。
这种方法称为位置参数调用法,所以需要严格对应顺序。

  也可以通过 name = value 的形式传递参数,比如上面的 nPrintln 函数,可以通过 nPrintln(n=3,message='balalala') 的方式进行调用,这样就不需要对应位置,就是敲起来烦点。

通过传递引用来传递参数

其实就是提前定义好变量的值,就比如上面的函数

def nPrintln(message,n):
    for i in range(n):
        print(message) 

def main():
#提前对变量进行赋值
    n = 3 
    message = '生活就是一坨狗屎'
    nPrintln(message,n) 
main()

模块化代码

㊙️ Keys:模块化可以使代码易于维护和调试,可以提高代码的重用性

例如,编写了一个最大公约数的函数

#最大公约数
def gcd(n1,n2):
    gcd = 1     # 初始化
    k = 2          
    while k <=  n1 and k<=n2:
        if n1 % k ==0 and n2 % k ==0:
            gcd = k
        k += 1

    return gcd

我可以在其他文件中通过 from GCDFunction import gcd的方法调用 gcd 函数,然后通过编写一个 main 函数进行调用。

def main():
   n1 = eval(input('请输入一个数'))
   n2 = eval(input('请输入另外一个数')) 
   
   print('两个数的最大公约数为: ', gcd(n1,n2))
main()

如果使用 import GCDFunction ,必须使用 GCDFunction.gcd 才能调用函数 gcd,例如,在定义了之前的 GCDFunction.py 之后,然后在另一个文件中,输入 import GCDFunction,然后定义了 main 函数,这时候就需要使用 GCDFunction.gcd 来进行调用。

def main():
   n1 = eval(input('请输入一个数'))
   n2 = eval(input('请输入另外一个数')) 
   
   print('两个数的最大公约数为: ',GCDFunction.gcd(n1,n2))
main()

这种方法具有如下的 优点

👍 1. 它将计算最大公约数的代码和其他代码分割开,这样使程序的逻辑性更加清晰而且可读性更好

👍2. 计算最大公约数的任何错误就被限定在函数 gcd 之中,缩小了调试范围。

👍3. 其他程序也可以重用函数 gcd 了。

变量的作用域

globalVar = 1
def f1():
  localVar = 2
  print(globalVar)    #全局变量
  print(localVar)

f1()
print(globalVar)
print(localVar)     #函数内的局部变量,打印会失败

globalVar 为全局变量,可以直接打印,在函数内部或者 procedure 中都可以直接打印,而在函数内部临时定义的变量如果没有经过传参,则无法直接都打印。

传参可以通过在内部直接使用全局变量来实现,例如:

# 在函数内部定义全局变量以实现传递出函数
x  = 1 
def increase():
    global x
    x  += 1
    print(x) 
increase()

默认参数

㊙️ Keys:Python 允许定义带默认参数值的函数。当函数被调用无参数。那么默认值就会传递给实参。
例如下面的 MWE

def printArea(width=1,height=2):
    area = width * height
    print('Width:', width,'\theight:', height,'\tarea:', area) 
printArea() 
printArea(2,3) 

会得到:

Width: 1 height: 2 area: 2
Width: 2 height: 3 area: 6

👉Notice: 函数可以混用默认值参数和非默认值参数,在这种情况下,非默认值参数必须要在默认值参数前。

👉Notice: 尽管许多语言支持在同一个模块里定义两个同名的函数,但是 Python 并不支持这个特点。通过默认参数只可以定义函数一次,但可以通过许多不同的方调用函数。这和其他语言中定义同名的多个函数的效果一样。如果定义了多个函数,那么后面的会顶替前面的

返回多个值

👉Keys: Python 的 return 语句可以返回多个值。
例如下面的 MWE:

def sort(number1,number2):
  if number1 < number2:
      return number1,number2
  else:
      return number2,number1
n1,n2 = sort(2,3) 
print('n1 is', n1 ) 
print('n2 is', n2) 

关键术语

actual parameter(实际参数)information hiding(信息隐藏)
argument(实参)keywords argument(关键字参数)
caller(调用者)local variable(局部变量)
default argument(默认参数)None function(None 函数)
divide and conquer(分治)paramaters(参数)
functions(函数)position argument(位置参数)
function header(函数头)scope of variable(变量的作用域)
global variable(全局变量)stepwise refinement(逐步求精)
immutable object(不可变对象)stub(待完善方式)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值