写点什么

挑战 30 天学完 Python:Day11 函数

作者:MegaQi
  • 2023-04-21
    上海
  • 本文字数:4827 字

    阅读完需:约 16 分钟

📘 Day 11

🎉 本系列为 Python 基础学习,原稿来源于英文项目,大奇主要是对其本地化翻译、逐条验证和补充。此系列适合零基础同学,或仅了解 Python 一点知识,但又没有系统学习的使用者。总之如果你想提升自己的 Python 技能,欢迎加入《挑战 30 天学完 Python》

作者:大奇 MegaQi | Info 签约作者 ,专注测试开发技术实战干货分享,欢迎访问主页长期关注。

Functions 函数

到目前为止,我们已经看到了许多内置的 Python 函数。在本节中,我们将重点介绍自定义函数。什么是函数?在我们开始制作函数之前,让我们先了解一下什么是函数以及为什么需要函数?

定义函数

函数是为了执行特定任务而设计可重用代码块或编程语句。在 Python 要定义或声明一个函数,使用了 def 关键字。下面是定义函数的语法。只有在调用函数时才执行函数块内代码。

声明和调用

当我们创建一个函数时,我们将其称为声明函数。当我们开始使用它时,我们称之为调用(calling 或 invoking)函数。它的声明可以带形参,也可以不带形参。


# 语法参考# 声明一个函数def function_name():    codes
# 使用声明的函数function_name()
复制代码

无参函数

当函数声明的时候可以不带任何参数。


# 实际例子def generate_full_name ():    first_name = 'Mega'    last_name = 'Qi'    space = ' '    full_name = first_name + space + last_name    print(full_name)generate_full_name () # 函数调用
def add_two_numbers (): num_one = 2 num_two = 3 total = num_one + num_two print(total)add_two_numbers()
复制代码

无参函数返回值

函数是可以有返回值的,如果函数没有返回语句,则函数的值为 None。让我们使用 return 重写上面的函数。从现在开始,当我们调用函数并打印它时,我们从函数中获得一个返回值。


def generate_full_name ():    first_name = 'Mega'    last_name = 'Qi'    space = ' '    full_name = first_name + space + last_name    return full_nameprint(generate_full_name())
def add_two_numbers (): num_one = 2 num_two = 3 total = num_one + num_two return totalprint(add_two_numbers())
复制代码

带参函数

在函数中,我们可以将不同的数据类型(数字、字符串、布尔值、列表、元组、字典或集合)作为参数传递


  • 单形参:如果函数接受一个参数,则调用函数时应附带一个实参


# 语法形式参考# 声明带一个参的函数def function_name(parameter):    codes
# 调用带参函数并给定参值print(function_name(argument))
复制代码


实际举例


def greetings (name):    message = name + ', welcome to Python for Everyone!'    return message
print(greetings('MegaQi')) # MegaQi, welcome to Python for Everyone!
def add_ten(num): ten = 10 return num + tenprint(add_ten(90)) # 100
def square_number(x): return x * xprint(square_number(2)) # 4
def area_of_circle (r): PI = 3.14 area = PI * r ** 2 return areaprint(area_of_circle(10)) # 314.0
def sum_of_numbers(n): total = 0 for i in range(n+1): total+=i return totalprint(sum_of_numbers(10)) # 55print(sum_of_numbers(100)) # 5050
复制代码


  • 两个参数:一个函数可能无参或一个参数,也可能有多个参数。因此函数也可以有两个或多个形参。


# 语法形式:声明带两个参数的函数def function_name(para1, para2):    codes
# 调用函数并传两个参数print(function_name(arg1, arg2))
复制代码


实战例子


def generate_full_name (first_name, last_name):    space = ' '    full_name = first_name + space + last_name    return full_nameprint('Full Name: ', generate_full_name('Mega','Qi'))
def sum_two_numbers (num_one, num_two): sum = num_one + num_two return sumprint('Sum of two numbers: ', sum_two_numbers(1, 9))
def calculate_age (current_year, birth_year): age = current_year - birth_year return age;
print('Age: ', calculate_age(2022, 1987))
def weight_of_object (mass, gravity): weight = str(mass * gravity)+ ' N' # 将数值先转换成字符后再拼接 return weightprint('Weight of an object in Newtons: ', weight_of_object(100, 9.81))
复制代码

传递带键和值的参数

上方只传值的方式必须要严格遵守参数位置顺序。如果想不受限制可以传递带有 key 和 value 的参数。


# 使用语法def function_name(para1, para2):    codes
# 调用方法通过指定key=valueprint(function_name(para1 = 'John', para2 = 'Doe'))print(function_name(para2 = 'Doe', para1 = 'John'))
复制代码


举例


def print_fullname(firstname, lastname):    space = ' '    full_name = firstname  + space + lastname    return full_nameprint(print_fullname(firstname = 'Mega', lastname = 'Qi'))
def add_two_numbers (num1, num2): total = num1 + num2 return totalprint(add_two_numbers(num2 = 3, num1 = 2)) # Order does not matter
复制代码

有参函数返回值

同无参数带返回值一样,有参函数也可以使用 return 返回函数值。以下举几个不同类型的返回例子。


  • 返回一个字符串:


def print_name(lastname):    return lastnameprint(print_name('Qi'))
def print_full_name(firstname, lastname): space = ' ' full_name = firstname + space + lastname return full_nameprint(print_full_name(firstname='Meage', lastname='Qi'))
复制代码


  • 返回一个数字


def add_two_numbers (num1, num2):    total = num1 + num2    return totalprint(add_two_numbers(2, 3))
def calculate_age (current_year, birth_year): age = current_year - birth_year return ageprint('Age: ', calculate_age(2022, 1987))
复制代码


  • 返回一个布尔值:


def is_even (n):    if n % 2 == 0:        print('even')        return True    # Return停止函数的进一步执行,类似于break    return Falseprint(is_even(10)) # Trueprint(is_even(7)) # False
复制代码


  • 返回一个列表


def find_even_numbers(n):    evens = []    for i in range(n + 1):        if i % 2 == 0:            evens.append(i)    return evensprint(find_even_numbers(10))
复制代码

带默认参数的函数

有时,在调用函数时,我们将默认值传递给参数。如果在调用函数时不传递实参,则使用它们的默认值。


# 语法形式:参数给定默认值def function_name(param = value):    codes
# 函数方法调用function_name()function_name(arg)
复制代码


实战例子


def greetings (name = 'Peter'):    message = name + ', welcome to Python for Everyone!'    return messageprint(greetings())print(greetings('Qi'))
def generate_full_name (first_name = 'Mega', last_name = 'Qi'): space = ' ' full_name = first_name + space + last_name return full_name
print(generate_full_name())print(generate_full_name('David','Smith'))
def calculate_age (birth_year,current_year = 2021): age = current_year - birth_year return age;print('Age: ', calculate_age(1821))
def weight_of_object (mass, gravity = 9.81): weight = str(mass * gravity)+ ' N' return weightprint('物体的重量(单位牛顿): ', weight_of_object(100))print('物体的重量(单位牛顿): ', weight_of_object(100, 1.62))
复制代码

任意参数函数

如果不知道传递给函数的实参数量,可以通过在形参名称前添加*来创建一个函数,该函数可以接受任意数量的实参。


# 语法形式 * 不确定参数def function_name(*args):    codes
# 调用方法传不定参数function_name(param1, param2, param3,..)
复制代码


实际例子


def sum_all_nums(*nums):    total = 0    for num in nums:        total += num     # 此计算方法等同于 total = total + num     return totalprint(sum_all_nums(2, 3, 5)) # 10
复制代码

函数参数混合使用

  • 实参和不定参数


首参给定 team,剩余其他以 list 形式给不定*args。但注意实参要在前面。否则会报 TypeError 错误。



def generate_groups (team, *args): print(team) for i in args: print(i)
# print(generate_groups('Team-1','Asabeneh','Brook','David','Eyob'))
复制代码


  • 函数作为另一个函数的参数


# 可以将函数作为参数传递def square_number (n):    return n ** ndef do_something(f, x):    return f(x)print(do_something(square_number, 3)) # 27
复制代码


🌕 到目前为止,你取得了很大的成就。继续前进!你刚刚完成了第 11 天的挑战,你向你的伟大之路前进了 11 步。现在检验下你的学习成功吧。

💻 第 11 天练习

练习 1 级

  1. 声明一个函数名为 add_two_numbers。它接收两个数字参数,然后经过求和计算返回其值。

  2. 圆的面积的计算方法如下:Area = π x r x r。写一个函数计算 area_of_circle

  3. 编写一个名为 add_all_nums 的函数,它接受任意数量的参数并对所有参数求和。要求检查是否所有列表项都是数字类型。如果没有则需要给出合适返回提示。

  4. 摄氏度°C 可以转换为华氏度°F,使用以下公式为 °F =(°C x 9/5) + 32。写一个函数将°C 转换为°F, 此函数名为 convert_celsius_to_fahrenheit

  5. 编写一个名为 check_season 的函数,它接受一个月份参数并返回其对应的季节:秋季、冬季、春季或夏季。

  6. 声明一个名为 print_list 的函数。它接受一个列表作为参数,并输出列表中的每个元素。

  7. 声明一个名为 reverse_list 的函数。它接受一个数组作为参数,并返回数组的反向(使用循环)。


    print(reverse_list([1, 2, 3, 4, 5]))    # [5, 4, 3, 2, 1]    print(reverse_list(["A", "B", "C"]))    # ["C", "B", "A"]
复制代码


  1. 声明一个名为 capitalize_list_items 的函数。它接受一个列表作为参数,并返回一个大写的项目列表。

  2. 声明一个名为 add_item 的函数。它接受一个列表和一个实参数。它返回一个末尾添加了项目的列表。


    food_staff = ['Potato', 'Tomato', 'Mango', 'Milk'];    print(add_item(food_staff, 'Meat'))     # ['Potato', 'Tomato', 'Mango', 'Milk','Meat'];    numbers = [2, 3, 7, 9];    print(add_item(numbers, 5))      [2, 3, 7, 9, 5]
复制代码


  1. 声明一个名为 remove_item 的函数。它接受一个列表和一个项参数。它返回一个删除了项目的列表。


    food_staff = ['Potato', 'Tomato', 'Mango', 'Milk'];    print(remove_item(food_staff, 'Mango'))  # ['Potato', 'Tomato', 'Milk'];    numbers = [2, 3, 7, 9];    print(remove_item(numbers, 3))  # [2, 7, 9]
复制代码


  1. 声明一个名为 sum_all_numbers 的函数。它接受一个 number 参数并将该范围内的所有数字相加。


print(sum_all_numbers(5))  # 15print(sum_all_numbers(10)) # 55print(sum_all_numbers(100)) # 5050
复制代码


  1. 声明一个名为 sum_of_odds 的函数。它接受一个数字参数,并将该范围内的所有奇数相加。

  2. 声明一个名为 sum_of_even 的函数。它接受一个数字参数,并将该范围内的所有偶数相加。

练习 2 级

  1. 声明一个名为 evens_and_odds 的函数。它取一个正整数作为参数,计算数字中偶数和奇数的个数。


    print(evens_and_odds(100))    # 奇数的个数是 50.    # 偶数的个数是 50.
复制代码


  1. 调用函数 factorial,它接受一个整数作为参数并返回这个数的阶乘。

  2. 调用自定义函数 is_empty,它接受一个参数并检查它是否为空。

练习 3 级

  1. 编写一个名为 is_prime 的函数,它检查一个数字是否是素数。

  2. 编写一个函数来检查列表中是否所有项都是唯一的。

  3. 编写一个函数来检查列表中的所有项是否都是相同的数据类型。


🎉 CONGRATULATIONS ! 🎉


github 项目(含参考答案)地址:https://github.com/QiCodeCN/30-Days-Of-Python-zh_CN

如喜欢通过“点赞👍收藏❤️关注➕”鼓励作者大奇

文章中如有错误或疑问欢迎指正和交流。

发布于: 刚刚阅读数: 6
用户头像

MegaQi

关注

InfoQ签约作者 |公众号: 非典型性程序员 2018-02-15 加入

分享一些系列测试平台开发教程,也记录一些自己研究的技术,遇到的问题,总之想分享一些干货内容,愿给这个行业贡献微不足道的力量,不断突破不断成长。

评论

发布
暂无评论
挑战 30 天学完 Python:Day11 函数_Python_MegaQi_InfoQ写作社区