初识Python必看基础知识~ 续(4)持续打卡中~

欢迎来到~ 初始Python 系列文章第四回”,我是 清汉 ~

一个刚刚上路的小白,此路非彼路哈~

不要乱想,我还在~
在这里插入图片描述

话不多说,🐎上见真章


DIY 4

声明:未打广告,全文知识梳理来源于《Python编程 从入门到实践(第2版)》豆瓣评分9.3

注:例中所有 >>> 符号后为输出结果



知识框图

关于整个python基础的知识脑图


第8章

函数

  • 当我们需要在程序中多次执行同一项任务时,如果反复编写执行该任务的代码,代码会变得臃肿不堪,不利于代码编写、阅读。但我们只需要将这段代码编写为一个函数,当执行同一项任务时调用该函数即可。
  • 优点:程序编写、代码阅读、测试、代码修复更加容易。

这是一张关于函数知识点的思维脑图


定义函数

例 1

  • 例中我们演示了如何创建一个函数,并对函数进行简单调用。
  • 函数调用后会自动执行函数内部的代码。
	# 例 1
# 定义函数
#关键字 def 定义函数,还可在圆括号内指出函数要完成任务需要什么样的信息。
#函数名为 greet_user()
def greet_user():
    '''显示简单的问候语'''  # 文档字符串的注释,描述函数是做什么的。
    print("Hello!")

greet_user() # 调用函数

# >>> Hello!

向函数传递信息
实参和形参

例 2

  • 可在函数定义 def greet_user_1() 的括号内添加一个参数,可让这个参数接受你指定的任何值,并在函数内部代码中使用。
  • 形参,函数括号内的参数。
  • 实参, 调用函数时传递给函数的信息。
	# 例 2
# 向函数传递信息
def greet_user_1(username): # 形参(parameter) 可让函数接受你给username指定的任何值
    '''显示简单的问候语,要求指定一个值(名字),传递给函数'''
    print(f"Hello, {username.title()}!")

greet_user_1('ze') # 实参(argument)
#将实参的值赋给了形参

# >>> Hello, Ze!

传递实参

例 3

  • 一个函数中可能存在多个形参,函数调用也就存在多个实参。这个时候我们需要一定的规则来对实参进行传递,不然给定的实参可能没有传递给相应的形参,造成错误。
位置实参
  • 按照实参的顺序传递给形参。函数调用的括号内的第一个实参,传递给函数括号内第一个形参。第二个实参,传递给第二个形参,若是还有第三个参数也是这样,,,
关键字实参
  • 直接将形参与实参关联起来,也就是直接指定给哪个形参名传递哪个实参。
	# 例 3
# 传递实参
#位置实参,基于实参的顺序赋值给形参
def describe_pet(animal_type, pet_name):
    '''显示宠物信息'''
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet('hamster', 'harry')
# >>> I have a hamster.
# >>> My hamster's name is Harry.

describe_pet('dog', 'willie') # 多次调用
# >>> I have a dog.
# >>> My dog's name is Willie.

#关键字实参,顺序无关紧要,Python知道各个值该赋给哪个形参。
describe_pet(pet_name='Doraemon', animal_type='cat')
# >>> I have a cat.
# >>> My cat's name is Doraemon.

形参默认值

例 4

	# 例 4
# 默认值
#给形参指定默认值后,可在函数调用中省略相应的实参。
#若提供了实参将忽略形参的默认值。
def describe_pet(pet_name, animal_type='dog'):
    '''显示宠物的信息。'''
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}.")

describe_pet(pet_name='willie')
# >>> I have a dog.
# >>> My dog's name is Willie.

describe_pet(pet_name='harry', animal_type='hamster')

# >>> I have a hamster.
# >>> My hamster's name is Harry.

返回值

例 5

  • 函数返回值,是这个函数内部代码处理数据或根据实参执行后的结果。
  • 可使用 return 语句将值返回到调用函数的代码行。
	# 例 5
# 返回值
def get_formatted_name(first_name, last_name):
    '''返回整洁的姓名'''
    full_name = f"{first_name} {last_name}"
    return full_name.title() # 将值返回到调用函数的代码行

musician = get_formatted_name('jimi', 'hendrix')
print(musician)
# >>> Jimi Hendrix

# 拓展
# 让实参变成可选的
#将可选实参相对应的形参默认值为空字符串且放在参数尾部
def get_formatted_name_1(first_name, last_name, middle_name=''):
    '''返回整洁的姓名'''
    if middle_name: #非空字符串为True
        full_name = f"{first_name} {middle_name} {last_name}"
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title() # 将值返回到调用函数的代码行

musician = get_formatted_name_1('jimi', 'hendrix')
print(musician)
# >>> Jimi Hendrix

musician = get_formatted_name_1('jimi', 'hendrix', 'lee')
print(musician)
# >>> Jimi Lee Hendrix

返回字典

例 6

  • 函数可返回任何类型的值,包括字典、列表等较复杂的数据结构。
  • 如果有需要多次重复创建字典的话,我们可以直接写一个函数,对此函数重复多次调用即可,也就优化了代码,减少了工作量啊~
	# 例 6
# 返回字典
# 形参默认值设置为特殊值None,表示变量没有值。
def build_person(first_name, last_name, age=None):
    '''返回一个字典,其中包含有关一个人的信息'''
    person = {'first': first_name, 'last': last_name}
    if age:
        person['age'] = age
    return person

musician = build_person('jimi', 'hendrix', 27)
print(musician)
# >>> {'first': 'jimi', 'last': 'hendrix', 'age': 27}

结合函数、while循环、input()

例 7

  • 用户交互实例中配和while循环,多次调用函数代码演示如下。
	# 例 7
# 函数与while循环
def get_formatted_name(first_name, last_name):
    '''返回整洁的姓名'''
    full_name = f"{first_name} {last_name}"
    return full_name.title()

#这是一个无限循环
while True:
    print("\nPlease tell me you name: ") # 请输入姓名
    print("(enter 'q' at any time to quit)") # 用户输入 q 退出while循环

    f_name = input("First name: ") # 提示用户输入姓
    if f_name == 'q': # 输入若是 q
        break # 退出循环

    l_name = input("Last name: ") # 提示用户输入名
    if l_name == 'q':
        break

    formatted_name = get_formatted_name(f_name,l_name) # 用户输入为实参,传输给函数形参,运行函数并赋值给变量
    print(f"\nHello, {formatted_name}!") # 打印变量
    
# >>> Please tell me you name: 
# >>> (enter 'q' at any time to quit)
# >>> First name: dl
# >>> Last name: xx

# >>> Hello, Dl Xx!

# >>> Please tell me you name: 
# >>> (enter 'q' at any time to quit)
# >>> First name: q

# 下一句为进程结束提示
# >>> Process finished with exit code 0


传递列表

例 8

  • 将列表作为参数传输给函数,函数可以直接访问列表内容。
  • 这样做可以提高列表处理的效率,后面几个“栗子”会做进一步演示。

在这里插入图片描述

	# 例 8
# 传递列表
def greet_users(names):
    '''向参数中的每位用户发出简单的问候'''
    for name in names:
        msg = f"Hello, {name.title()}!"
        print(msg)

usernames = ['hannah', 'ty', 'margot']
greet_users(usernames) # 将列表作为实参赋值给形参

函数中修改列表

例 9

  • 利用函数将一个列表中的元素转移到另一个列表中。
  • 当我们写好函数后,每次需要转移列表中的元素时,只需调用这个函数即可。
  • 是不是很方便啊~
	# 例 9
# 在函数中修改列表
#将第一个形参中的列表元素,转移到第二个形参列表中
def print_models(unprinted_designs, completed_models):
    '''
    模拟打印每个设计,直到没有未打印的设计为止。
    打印每个设计后,都将其移到列表 completed_models 中。
    '''
    while unprinted_designs:
        current_designs = unprinted_designs.pop() # 删除列表中最后一个元素,弹出赋值给变量
        print(f"Printing model: {current_designs}")
        completed_models.append(current_designs)

def show_completed_modles(completed_models):
    '''显示打印好的所有模型。'''
    print("\nThe following models have been printed:")

    for completed_model in completed_models:
        print(completed_model)

unprinted_designs = ['phone case', 'robot pendant', 'dodecahedron']
completed_models = []

#运行函数 print_models(),将列表 unprinted_designs 中的元素,转移到空列表completed_models中
print_models(unprinted_designs, completed_models) # 第一个实参为有元素的列表,第二个形参为空列表

# >>> Printing model: dodecahedron
# >>> Printing model: robot pendant
# >>> Printing model: phone case

# print_models(unprinted_designs[:], completed_models) # 可使用列表副本运行函数,可用于保留列表原数据

#运行函数 show_completed_modles ,打印列表 completed_models
show_completed_modles(completed_models)
# >>> The following models have been printed:
# >>> dodecahedron
# >>> robot pendant
# >>> phone case

#运行函数 show_completed_modles 打印列表 unprinted_designs,因为已经将元素传递到了列表 completed_models,所以列表 unprinted_designs 为空
show_completed_modles(unprinted_designs)
# >>> The following models have been printed

传递任意数量的实参

例 10

  • Python 允许函数从调用语句中收集任意数量的实参。
  • 形参名前加一个星号 * ,表示创建一个名为这个形参的空列表,用来存储任意数量的实参。
	# 例10
# 传递任意数量的实参
#形参名 *toppings 中的 星号 让Python创建一个名为 toppings 的空元组,并将收到的所有值封装到元组中。
def make_pizza(size, *toppings): # 若是接受不同类型的实参,必须在函数定义中将接纳任意数量的形参放在最后面。
                                 # Python 先匹配位置实参和关键字实参,再将余下的实参收集到最后一个形参中。
    '''概述要制作的比萨'''
    print(f"\nMaking a {size}-inch pizza with the following toppings:")
    for topping in toppings:
        print(topping)

make_pizza('16', 'mushrooms', 'green peppers')

# >>> Making a 16-inch pizza with the following toppings:
# >>> mushrooms
# >>> green peppers

使用任意数量的关键字实参

例 11

  • 形参名前加两个星号 ** ,表示创建一个名为这个形参的空 字典, 用来存储任意数量的 键值对。
	# 例 11
#使用任意数量的关键字实参
#形参名 **user_info 中的 两个星号 让Python创建一个名为 user_info 的空字典,并将收到的所有名称值对都放入字典中。
def build_profile(first, last, **user_info):
    '''创建一个字典,其中包含我们知道的有关用户的一切。'''
    user_info['first_name'] = first
    user_info['last_name'] = last
    return user_info

user_profile = build_profile('albert', 'einstein',
                             location= 'princeton',
                             field= 'physics')
print(user_profile)

# >>> {'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}

将函数存储在模块中
  • 也就是将函数存储在独立的 .py 文件中,这个独立的文件就称为模块
导入模块

例 12

  • 当我们主程序中需要调用此函数时,需先导入模块。
  • 主程序中使用 import 语句导入模块
    • 可导入整个模块
    • 可导入特定函数
    • 导入模块中所有函数

注:例12 导入的模块函数为 例10 的函数,请参照 例10 理解函数调用

	# 例 12
# 导入整个模块,模块内包含一个函数
# import语句指定模块名,就可以在程序中使用该模块的所有函数。
import pizza
#调用导入模块中的函数,可指定被导入模块名称和函数名,并用 . 句点分隔
pizza.make_pizza(16, 'pepperoni')
# >>> Making a 16-inch pizza with the following toppings:
# >>> pepperoni

pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extera cheese')
# >>> Making a 12-inch pizza with the following toppings:
# >>> mushrooms
# >>> green peppers
# >>> extera cheese

# 导入特定函数,通过逗号分隔符,可根据需要导入模块中任意数量的函数。
from pizza import make_pizza #, make_pizza_0, make_pizza_1
make_pizza(11, 'Python')
# >>> Making a 11-inch pizza with the following toppings:
# >>> Python

# 导入模块中所有函数
# 导入模块时最好不要用这种方法,因为不知道模块中的函数是否存在与当前项目中相同的函数名称。
from pizza import * # 星号运算符可让Python导入模块中所有的函数
make_pizza(111, 'TJ')
# >>> Making a 111-inch pizza with the following toppings:
# >>> TJ

模块、函数指定别名

例 13

  • 如果导入的模块、函数名称与主程序中的名称冲突或名称太长不好记,可指定一个简短的又独一无二的名称。
  • 注意:需要在导入它的时候指定别名。

注:例13 导入的模块函数为 例10 的函数,请参照 例10 理解函数调用

	# 例 13
# 使用as给函数指定别名
from pizza import make_pizza as mp
mp(16, 'pepperoni')
# >>> Making a 16-inch pizza with the following toppings:
# >>> pepperoni

#使用 as 给模块指定别名
import pizza as p
p.make_pizza(15, 'python')
# >>> Making a 15-inch pizza with the following toppings:
# >>> python

感谢,每一位认真阅读到这里的少侠!来个手滑三联吧,不迷路~

一张猫咪比心的表情包
关于一键三联的图片


又是一篇大章节,独占我一篇文章~

我呢,是站在小白的角度上梳理内容,写的很啰嗦~

希望大家阅读的时候不要烦哈~

我写的这些希望小白们能看的明白,看的真切~

若是,有幸大佬们踩到这篇文章,就直接略过注释就好了~ 哈哈~

这是一张描述学习的表情包


下期见,等你哟~


在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值