Python——函数

函数的定义

例如:需要计算圆的面积S
圆的面积计算公式:S = πrr
当知道半径r的值时,就可以根据公式计算出面积
假设需要计算3个不同大小的圆的面积:

r1 = 1
r2 = 2
r3 = 3
s1 = 3.14 * r1 * r1
s2 = 3.14 * r2 * r2
s3 = 3.14 * r3 * r3
print(s1, s2, s3)
'''3.14 12.56 28.259999999999998'''

当代码出现有规律的重复的时候,就需要注意了;
每次写3.14 * x * x不仅很麻烦,而且如果要把3.14改成3.1415926535的时候,三个面积计算表达式得全部替换;
假定有一个函数名为area_of_circle,可以基于半径计算面积;
那就可一不再每次都写s = 3.14 * x * x,而是写成更有意义的函数调用方式s = area_of_circle(x),而函数area_of_circle本身只需要写一次,就可以被多次调用,如果需要修改,只需修改函数本身,调用不需要改动;
基本上所有的高级语言都支持函数,Python也不例外;
Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数。

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
  • 函数能提高应用的模块性,和代码的重复利用率
  • Python提供了许多内建函数,比如print()、type()、类型转换函数等等
  • 用户也可以自己创建函数,这被叫做用户自定义函数:
    自定义函数格式
    函数定义的规则:
  • 函数代码块以 def 关键词开头,后接函数名称和圆括号 ()
  • 如果需要传入参数(变量),可在圆括号内定义
  • 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
  • 函数内容以冒号 : 起始,并且缩进
  • 可选择性地使用return返回一个值给调用方,不 return 相当于返回 None
  • 在Python中不需要定义返回值类型,可自动推断

函数的使用

基于上述规则,可以定义一个函数计算圆的面积S,如下代码所示

  • 函数名:area_of_circle
  • 参数:需要传入一个半径r
  • 功能:基于半径r,计算圆的面积S
  • 返回值:将计算好的面积S给函数调用者
    再调用函数,如下代码所示
# 定义一个计算圆面积的函数
def area_of_circle(r):
    PI = 3.14
    S = PI * r * r
    return S
#函数的调用
if __name__ == '__main__':
    S1 = area_of_circle(1)
    S2 = area_of_circle(2)
    S3 = area_of_circle(3)
    print(S1, S2, S3)
'''3.14 12.56 28.259999999999998'''

如需定义空函数,可使用pass:

def nop():
    pass

函数的参数

  • 定义函数的时候,需要把参数的名字和位置确定下来,函数的接口定义就完成了
  • 函数定义的过程其实就是一种抽象的过程
  • 对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解
  • Python的函数定义非常简单,但灵活度却非常大
  • 除定义的必选参数外,还可使用默认参数可变参数、关键字参数命名关键字参数
  • 使得函数定义出来的接口,不但能处理复杂的参数,还可简化调用者的代码

必选参数

又名位置参数,调用函数时必须按顺序提供,不多不少
例如:定义一个函数用于计算x的平方

def power(x):
    return x * x
  • 对于power函数来说,x就是一个位置参数
  • 当调用函数时,必须传入有且仅有的一个参数x
    假如现在又要计算x3怎么办?可以再定义一个power3函数,但是如果要计算x4、x^5……怎么办?不可能定义无限多个函数,那可以把power(x)修改为power(x, n),再结合while循环用来计算x^n
def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
if __name__ == '__main__':
    a = power(2, 3)
    print(a)
'''8'''
  • 对于这个修改后的power(x, n)函数,可以计算x的任意n次方
    x和n,这两个参数都是位置参数
  • 调用函数时,需要按照位置顺序依次将值传入并赋给参数x和n

默认参数

新的power(x, n)函数定义没有问题,但是,旧的调用代码失败了,原因是增加了一个参数,导致旧的代码因为缺少一个参数而无法正常调用

def power(x, n):
    s = 1
    while n > 0:
        n = n-1
        s = s * x
    return s

if __name__ == '__main__':
    b = power(4)
    print(b)
'''
会报错:
Traceback (most recent call last):
    b = power(4)
TypeError: power() missing 1 required positional argument: 'n'
'''

假如经常需要计算x^2,那这个时候默认参数就派上用场了
可将第二个参数n的默认值设定为2

def power(x, n = 2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
  • 当调用power(4)时,相当于调用power(4, 2)

  • 当调用power(5, 3)时,相当于计算了5^3

if __name__ == '__main__':
    b = power(4)
    print(b)
    c = power(5)
    print(c)
'''
8
125
'''
  • 注意:

    • 必选参数在前,默认参数在后,否则Python的解释器会报错
    • 函数有多个参数时,把变化大的参数放前面,变化小的参数放后面,变化小的参数就可以作为默认参数

可变参数

在Python函数中,还可以定义可变参数,顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个
print函数支持传入可变参数
假设给定一组数字a,b,c……,需要定义函数计算a^2 + b^2 + c^2 + ……
由于参数个数不确定,可a,b,c……作为一个list或tuple传进来

  • 调用的时候,需要先组装出一个list或tuple
  • calc([1, 2, 3])
  • calc((1, 3, 5, 7))
def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

if __name__ == '__main__':
    print(calc([1, 2, 3]))
    print(calc((1, 3, 5, 7)))
'''
14
84
'''

也可以使用可变参数

  • 调用函数的方式可以简化
  • calc(1, 2, 3)
  • calc(1, 3, 5, 7)
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
    
if __name__ == '__main__':
    print(calc(1, 2, 3))
    print(calc(1, 3, 5, 7))
'''
14
84
'''

关键字参数

可变参数允许传入0个或任意个参数,可变参数在函数调用时自动组装为一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,示例如下:

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

函数person除了必选参数name和age外,还接受关键字参数kw
在调用该函数时,可以只传入必选参数:

if __name__ == '__main__':
    person('zxs', 21,)
'''
name: zxs age: 21 other: {}
'''

也可以传入任意个数的关键字参数:

if __name__ == '__main__':
    person('zxs', 21, city = '北京')
    person('zxs', 21, city = '北京', job = 'Engibeer')
'''
name: zxs age: 21 other: {'city': '北京'}
name: zxs age: 21 other: {'city': '北京', 'job': 'Engibeer'}
'''

命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查
以person()函数为例,希望检查是否有city和job参数,则需要手动判断:

def person(name, age, **kw):
    if 'city' in kw:
        # 有city函数
        pass
    if 'job' in kw:
        # 有job函数
        pass
    print('name:', name, 'age:', age, 'other:', kw) 
  • 命名关键字参数函数调用方式如下:
person('jack', 24, city = 'Beijing', job = 'Engineer')
'''jack 24 Beijing Engineer''' 
  • 命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):
    print(name, age, city, job)
  • 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
  • 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *arges, city, job):
    print(name, age, arges, city, job)

参数组合

  • 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用
  • 注意参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
  • 定义一个函数f1,包含上述所有参数类型:
def f1(a, b, c=0, *args, d, e, **kw):
    print('a=', a, 'b=', b, 'c=', c, 'args=', 'd=', d, 'e=', e, 'kw=', kw)
  • f1函数的调用:
if __name__ == '__main__':
    f1(1, 2, 3, 4, 5, 6, d=7, e=8, k1=9, k2=10, k3=11)
'''
a = 1 b = 2 c = 3 args = d = 7 e = 8 kw = {'k1': 9, 'k2': 10, 'k3': 11}
'''
### Python 函数用于计算思维训练 #### 方法和示例 Python 提供了一种强大的方式来进行计算思维训练,特别是通过函数的设计与实现。函数不仅有助于代码的模块化设计,还促进了逻辑思考能力的发展。 #### 问题分解 一个问题可以被拆解成更小的部分以便更容易解决。例如,在处理复杂的数据集时,可以通过编写多个小型专用功能来逐步解决问题[^1]。下面是一个具体的例子: 假设有一个是要找出列表中所有偶数的位置索引。这个问题可以通过构建辅助函数 `is_even` 来判断单个数字是否为偶数,再利用另一个遍历整个列表并收集符合条件项位置的功能完成最终目标。 ```python def is_even(number): """Check if a number is even.""" return number % 2 == 0 def find_indices_of_evens(lst): """Find indices of all even numbers in the list.""" result = [] for index, value in enumerate(lst): if is_even(value): result.append(index) return result ``` 这段代码展示了如何将大任务分割成易于管理和理解的小部分——这正是计算思维的核心之一。 #### 自定义函数的应用 除了上述提到的问题分解技巧外,还可以创建自定义函数以满足特定的需。比如想要统计一段文字里单词的数量,就可以按照以下步骤操作[^3]: 1. 定义一个新的函数接受字符串作为输入; 2. 使用内置 split() 方法把句子切分成词组; 3. 计算得到的结果集合大小即代表总共有多少个不同词语; 这里给出完整的解决方案如下所示: ```python def word_count(text): words = text.split() unique_words = set(words) return len(unique_words) example_text = "This is an example sentence with some repeated words like this and that" print(word_count(example_text)) ``` 此程序片段说明了怎样运用自定义函数有效地解决了实际生活中的一个小挑战。 #### 实现加法运算器 为了进一步展示 Python 函数对于培养计算思维方式的重要性,考虑这样一个场景:开发一个简单的计算器应用程序,其中一部分负责执行两数值相加的任务。该过程涉及到了基本算法的理解以及良好的编码习惯养成等方面[^4]。 ```python def add_numbers(a, b): """Add two given numbers together""" sum_result = a + b return sum_result num1 = float(input("Enter first number: ")) num2 = float(input("Enter second number: ")) result = add_numbers(num1, num2) print(f"The addition of {num1} and {num2} equals to {result}") ``` 以上实例强调了函数在简化重复工作流程方面的作用,同时也体现了结构清晰、易于调试的优点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值