0

自定义函数

自定义函数就是自己编写函数,以方便自己后续使用。函数的基本样式如下: 自定义函数 你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return 表达式 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
def {function}({parameters}):
    {statements}
    return {value}

接下来,我们来实现一个阶乘函数 factorial:

def factorial(number):
    result = 1
    for i in range(1, number + 1):
        result *= i
    return result
f1 = factorial(5)
f2 = factorial(10)
print(f1)
print(f2)

这个阶乘函数叫 factorial,可以自己定义,命名规则参照变量命名规则

它接收一个参数 number。

函数代码是实现阶乘功能。

最终 return 返回阶乘计算结果。

调用 factorial(5)后会得到 5 的阶乘结果,存储在 f1 里。

调用 factorial(10)后会得到 10 的阶乘结果,存储在 f2 里。

参数传递

在讲列表的时候,我们讲了地址引用与值引用,在函数的参数传递时,这个概念尤为重要。请运行以下代码:

def update(number, lists):
    number = 10
    lists[0] = 10
number1 = 20
lists1 = [1,2,3]
update(number1,lists1)
print(number1) #输出20,不变
print(lists1) #输出[10,2,3],变了

在上述代码中

  • number1 是值引用,所以在 update 函数里,number 是一个独立的值,修改 number,并不能影响 number1。
  • lists1 是地址引用,所以实际上传递给 lists 的是地址,所以 lists 和 lists1 指向的是同一个地址,修改 lists 里的值,就是修改 lists1 里的值。

函数作用域

函数里的参数和变量和外面的变量是相互独立的关系,就算命名相同,函数内部的参数,也不会影响外面的变量,只会影响函数内部的代码,函数内部的变量,外面不能访问。

def update(number):
    number = 10
    number2 = 20
number = 20
update(number)
print(number) #输出20,不变
print(number2) #报错

在上述代码中,函数里的 number 不能修改外面 number 的值,函数里的 number2,外面不能访问。

全局变量和局部变量

有了函数之后,外面就有了全局变量的概念。

  • 在函数外部声明的变量是全局变量
  • 在函数内部声明的变量是局部变量
def double():
    number2 = number + number #局部变量
    print('number2:',number2) #输出40
number = 20 #全局变量
double()
print('number:',number) #输出20,不变
print(number2) #报错

上面已经演示了函数可以访问全局变量 number,但函数外面不能访问局部变量 number2。

一般不建议在函数内部访问与修改全局变量,应该尽量使用函数传递与返回值的方法来与全局变量交互。例如:

def update(number):
    number = 10
    return number
number = 20
number = update(number)
print(number) #输出10,变了

如果一定要在函数内部修改全局变量,可以使用 global 语句来标记。

def update():
    global number
    number = 10
number = 20
update()
print(number) #输出10,变了

参数声明

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

例如 factorial() 函数必须传入一个参数,不然会出现语法错误:

def factorial(number):
    result = 1
    for i in range(1, number + 1):
        result *= i
    return result
f1 = factorial(5)
print(f1)
f2 = factorial()#报错

默认参数

可以在声明函数时,指定参数的默认值,这样在调用函数时,如果没有传递参数,则会使用默认参数。

def printInfo(name, age = 18):
   print('My name is {}, and I am {} years old'.format(name,age))
printInfo('Oldmoon')

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

def printInfo(name, age):
   print('My name is {}, and I am {} years old'.format(name,age))
printInfo(age = 18, name = 'Oldmoon') #使用关键字参数时,参数传递顺序可以不一致

不定长参数

有的时候,函数需要接受非固定长度的参数,此时可以使用星号 * 来实现。 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

def total(*numbers):
    summary = 0
    #print('numbers',numbers) #可以打印出numbers看看效果
    for i in numbers:
        summary += i
    return summary
#传递任意数量的参数给total都可以
print(total(1,2,3)) #输出6
print(total(1,2)) #输出3

匿名函数

Python 使用 lambda 来创建匿名函数。

lambda [arg1 [,arg2,.....argn]]:statements

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

一个实现计算平方数的匿名函数示例代码:

square = lambda a : a * a
print(square(3)) #输出9

模块化编程

下面使用自定义函数来实现模块化编程,画一颗任意形状和高度的树,让代码结构更加清晰。

def printLine(symbol, space_count, symbol_count):
    print(' '*space_count+symbol*symbol_count)
def printTree(symbol, top_height, bottom_height):
    for i in range(top_height):
        printLine(symbol,top_height-i-1,2*i+1)
    for j in range(bottom_height):
        space_count = (2*top_height-1)//3
        width = (2*top_height-1) - 2*space_count
        printLine(symbol,space_count,width)
def draw():
    symbol, top_height, bottom_height=input().split()
    top_height=int(top_height)
    bottom_height=int(bottom_height)
    printTree(symbol,top_height,bottom_height)
draw()
Python变量命名规则题目1

以下选项中,符合 Python 语言变量命名规则的是( )。

[0/1]
变量
命名规则
函数
def update(number):
  global number
    number = 10
    return number

number = 20
update(number)
print(number)

程序会输出:

[0/1]
函数
def update(number):
    number = 10
    return number

number = 20
number = update(number)
print(number)

程序会输出:

[0/1]
函数
def update(number, lists):
    number = 1
    lists[0] = 2

number1 = 2
lists1 = [1,2,3]
update(number1,lists1)
print(number1,lists1[0])

程序会输出:

[0/1]
字符串
a = 'app'
b = 'hi ' + a
c = b*2
print(c)

程序会输出

[0/1]
字符串

变量a='apple',以下哪个代码可以将a变成'bpple'?

[0/1]
上一章
system
下一章
exercise