当前位置: 首页 > news >正文

第8章 函数

第8章 函数

  • 8.1 定义函数
    • 8.1.1 向函数传递信息
    • 8.1.2 实参和形参
  • 8.2 传递实参
    • 8.2.1 位置实参
    • 8.2.2 关键字实参
    • 8.2.3 默认值
  • 8.3 返回值
    • 8.3.1 返回简单值
    • 8.3.2 让实参变成可选的
    • 8.3.3 返回字典
    • 8.3.4 结合使用函数和 while 循环
  • 8.4 传递列表
    • 8.4.1 在函数中修改列表
    • 8.4.2 禁止函数修改列表
  • 8.5 传递任意数量的实参
    • 8.5.1 结合使用位置实参和任意数量实参
    • 8.5.2 使用任意数量的关键字实参
  • 8.6 将函数存储在模块中
    • 8.6.2 导入特定的函数
    • 8.6.3 使用 as 给函数指定别名
    • 8.6.4 使用 as 给模块指定别名
    • 8.6.5 导入模块中的所有函数
  • 8.7 函数编写指南

在这里插入图片描述

8.1 定义函数

一个简单的例子

def greet_user():  # 定义函数print('Hello')  greet_user()  # 调用函数

8.1.1 向函数传递信息

可在函数定义 def greet_user()的括号内添加 username。

def greet_user(username):  # 定义函数print(f'Hello,{username}')greet_user('python')  # 调用函数

在这里插入图片描述

8.1.2 实参和形参

形参(parameter),即函数完成工作所需的信息。
实参(argument),即调用函数时传递给函数的信息。
在上述例子中,变量username是一个形参。在代码greet_user(‘python’)中’python’是一个实参。

8.2 传递实参

8.2.1 位置实参

  1. 多次调用函数
  2. 位置实参的顺序很重要
def describe_pet(pet,name):  # 定义函数print(f"My {pet}'s name is {name}")describe_pet('dog', 'haha')  # 调用函数
# My dog's name is haha

8.2.2 关键字实参

关键字实参是传递给函数的名称值对。

def describe_pet(pet,name):  # 定义函数print(f"My {pet}'s name is {name}")describe_pet(name = 'haha',pet = 'dog')  # 调用函数
# My dog's name is haha

8.2.3 默认值

给形参指定默认值后,可在函数调用中省略相应的实参。

def describe_pet(pet, name='xixi'):  # 定义函数print(f"My {pet}'s name is {name}")describe_pet(pet = 'dog')  # 调用函数
# My dog's name is xixi

8.3 返回值

8.3.1 返回简单值

调用返回值的函数时,需要提供一个变量,以便将返回的值赋给它。

def get_name(first_name, last_name):  # 定义函数name = f'{first_name} {last_name}'return namehe = get_name('Li', 'Hua')
print(he)

8.3.2 让实参变成可选的

可使用默认值来让实参变成可选的。

8.3.3 返回字典

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

def get_name(first_name, last_name):  # 定义函数name = {'first': first_name, 'last':last_name}return namehe = get_name('Li', 'Hua')
print(he)

在这里插入图片描述

8.3.4 结合使用函数和 while 循环

可将函数同本书前面介绍的任何 Python 结构结合起来使用。

def fn(num):  # 定义函数print(num * 2)i = 1
while i <=3 :print(i)fn(i)i = i + 1

8.4 传递列表

8.4.1 在函数中修改列表

将列表传递给函数后,函数就可对其进行永久性的修改。

def fn(ss):while 'C' in ss:ss.remove('C')return ssstr1 = ['A', 'B', 'C', 'D', 'C', 'C']
str2 = fn(str1)
print(str1)  # ['A', 'B', 'D']
print(str2)  # ['A', 'B', 'D']

8.4.2 禁止函数修改列表

向函数传递列表的副本,这样函数所做的修改都不受影响原件。
切片表示法[:] 创建列表的副本。

def fn(ss):while 'C' in ss:ss.remove('C')return ssstr1 = ['A', 'B', 'C', 'D', 'C', 'C']
str2 = fn(str1[:])  # 传入副本
print(str1)  # ['A', 'B', 'C', 'D', 'C', 'C']
print(str2)  # ['A', 'B', 'D']

8.5 传递任意数量的实参

8.5.1 结合使用位置实参和任意数量实参

在函数定义中将接纳任意数量实参的形参放在最后。

def fn(ss, *args):

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

将函数编写成能够接受任意数量的键值对——调用语句提供了多少就接受多少。

8.6 将函数存储在模块中

在这里插入代码片## 8.6.1 导入整个模块
要让代码是可导入的,得先创建模块。模块是扩展名为.py 的文件,包含要导入到程序中的代码。
下面来创建一个包含函数make_pizza()的模块。为此,将文件pizza.py中除函数make_pizza()之外的其他代码全部删掉。

# pizza.py
def make_pizza(size, *toppings):print(size)for topp in toppings:print(topp)

接下来,在pizza.py所在的目录中创建一个名为making_pizzas.py的文件。这个文件导入刚创建的模块,再调用make_pizza()。

import pizza
pizza.make_pizza(16, 'A')
pizza.make_pizza(12, 'A', 'B', 'C')

8.6.2 导入特定的函数

还可以导入模块中的特定函数,这种导入方法的语法如下:

from module_name import function_name

例如

from pizza import make_pizza

通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数。

8.6.3 使用 as 给函数指定别名

要给函数取这种特殊外号,需要在导入它时指定。

from pizza import make_pizza as mp

8.6.4 使用 as 给模块指定别名

通过给模块指定简短的别名,能够更轻松地调用模块中的函数。

import pizza as pi

8.6.5 导入模块中的所有函数

使用星号(*)运算符可让 Python 导入模块中的所有函数。

from pizza import *

8.7 函数编写指南

给形参指定默认值时,等号两边不要有空格。
对于函数调用中的关键字实参,也应遵循这种约定。
PEP 8 建议代码行的长度不要超过 79 字符。
大多数编辑器会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩
进程度相同。
如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开。
所有 import 语句都应放在文件开头。唯一例外的情形是,在文件开头使用了注释来描述整个程序。

相关文章:

  • C++的STL 中 set.map multiset.multimap 学习使用详细讲解(含配套OJ题练习使用详细解答)
  • 细说ARM MCU的串口接收数据的实现过程
  • 3D感知视觉表示与模型分析:深入探究视觉基础模型的三维意识
  • 【介绍下Pandas,什么是Pandas?】
  • VitePress做一个自己的知识博客
  • OpenGauss常操作
  • 通过 urllib 结合代理IP下载文件实现Python爬虫
  • 数组循环form表单对象校验
  • Project 项目管理软件真的好用吗?
  • 为什么PPT录制没有声音 电脑ppt录屏没有声音怎么办
  • sed删除文件中所有空格,包括空格、制表符和其他空白字符
  • Unity Shader基础知识的入门了解
  • 23种设计模式之代理模式
  • 递归解析 LXML 树并避免重复进入某个节点
  • Plotly : 超好用的Python可视化工具
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • java中的hashCode
  • JS笔记四:作用域、变量(函数)提升
  • REST架构的思考
  • tweak 支持第三方库
  • WebSocket使用
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 代理模式
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 深度学习中的信息论知识详解
  • 通信类
  • 问题之ssh中Host key verification failed的解决
  • 我是如何设计 Upload 上传组件的
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习笔记:对象,原型和继承(1)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # Apache SeaTunnel 究竟是什么?
  • # linux从入门到精通(三)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (20050108)又读《平凡的世界》
  • (a /b)*c的值
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (南京观海微电子)——示波器使用介绍
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)c++ std::pair 与 std::make
  • (转)Linq学习笔记
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • . NET自动找可写目录
  • .dwp和.webpart的区别
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 知识杂记
  • .Net(C#)自定义WinForm控件之小结篇
  • .net操作Excel出错解决
  • .net快速开发框架源码分享
  • .Net实现SCrypt Hash加密
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解