翻译:《实用的Python编程》01_07_Functions

2023-11-18

目录 | 上一节 (1.6 文件) | 下一节 (2.0 处理数据)

1.7 函数

随着程序开始变大,我们会想要有条理地组织这些程序。本节简要介绍函数、库模块以及带有异常的错误处理。

自定义函数

对你要重用的代码使用函数。下面是函数的定义方式:

def sumcount(n):
    '''
    Returns the sum of the first n integers
    '''
    total = 0
    while n > 0:
        total += n
        n -= 1
    return total

函数调用:

a = sumcount(100)

函数是执行某些任务并返回结果的一系列语句。 return 关键字需要显式指定函数的返回值。

库函数

Python 带有一个大型的标准库。使用 import 访问库模块。示例:

import math
x = math.sqrt(10)

import urllib.request
u = urllib.request.urlopen('http://www.python.org/')
data = u.read()

稍后,我们将更详细地介绍库和模块。

错误和异常

函数将错误报告为异常。异常会导致函数中止,如果未处理,可能会导致整个程序终止。

在你的 Python 解释器(REPL)中尝试一下:

>>> int('N/A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'N/A'
>>>

出于调试的目的,上面的错误信息描述了发生的情况,错误产生的位置以及回溯。该回溯显示导致失败的其它函数调用。

捕获和处理异常

异常可以被捕获并处理。要捕获异常,使用 try - except 语句:

for line in f:
    fields = line.split()
    try:
        shares = int(fields[1])
    except ValueError:
        print("Couldn't parse", line)
    ...

该名称 ValueError 必须与你尝试捕获的错误类型匹配。

通常,根据所执行的操作,很难提前确切地知道可能会发生哪种错误。不管是好是坏,通常会添加在程序意外奔溃后的异常处理(示例:”天哪,我们忘记捕获错误了。我们应该处理错误的。“)。

触发异常

要触发异常,请使用 raise 语句:

raise RuntimeError('What a kerfuffle')

这将导致程序因异常回溯而中止,除非该异常通过 try-except 代码块捕获。

% python3 foo.py
Traceback (most recent call last):
  File "foo.py", line 21, in <module>
    raise RuntimeError("What a kerfuffle")
RuntimeError: What a kerfuffle

练习

练习 1.29:定义一个函数

尝试定义一个简单的函数:

>>> def greeting(name):
        'Issues a greeting'
        print('Hello', name)

>>> greeting('Guido')
Hello Guido
>>> greeting('Paula')
Hello Paula
>>>

如果函数的第一条语句是字符串,那么它被当做文档字符串。尝试输入一个命令来显示该文档字符串,例如 help(greeting)

练习 1.30:将脚本转换为函数

把你在 练习1.27pcost.py 程序编写的代码放到 portfolio_cost(filename) 函数里面。此函数以文件名作为输入,读取文件中的投资组合数据,把投资组合总的费用作为浮点数返回。

要使用你的函数,请修改程序,使其看起来像下面这样:

def portfolio_cost(filename):
    ...
    # Your code here
    ...

cost = portfolio_cost('Data/portfolio.csv')
print('Total cost:', cost)

运行程序时,你应该会看到和以前一样的输出。运行程序后,你也可以输入一下命令来交互式地调用函数:

bash $ python3 -i pcost.py

这将允许你从交互模式调用函数:

>>> portfolio_cost('Data/portfolio.csv')
44671.15
>>>

能够交互地试验代码对调试和测试非常有用。

练习 1.31:错误处理

如果你在缺少某些字段的文件上使用函数,会发生什么情况?

>>> portfolio_cost('Data/missing.csv')
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "pcost.py", line 11, in portfolio_cost
    nshares    = int(fields[1])
ValueError: invalid literal for int() with base 10: ''
>>>

在这一点上,你面临一个决定:要使程序正常工作,你可以通过消除错误行(bad lines)来清理原始输入文件,或者修改代码,以某种方式处理错误行。

请修改 pcost.py 程序以捕获异常,打印警告信息然后继续处理文件余下部分。

练习1.32:使用库函数

Python 带有一个拥有大量有用函数的大型标准库。csv 模块是一个在这里可能有用的库。无论何时,每当必须必须使用 CSV 数据文件时,都应使用 csv 模块。下面是一个有关 csv 模块是如何工作的示例:

>>> import csv
>>> f = open('Data/portfolio.csv')
>>> rows = csv.reader(f)
>>> headers = next(rows)
>>> headers
['name', 'shares', 'price']
>>> for row in rows:
        print(row)

['AA', '100', '32.20']
['IBM', '50', '91.10']
['CAT', '150', '83.44']
['MSFT', '200', '51.23']
['GE', '95', '40.37']
['MSFT', '50', '65.10']
['IBM', '100', '70.44']
>>> f.close()
>>>

csv 模块有一个非常棒的功能——它处理各种底层细节,例如引号和适当的逗号拆分。在上面的输出中,你会注意到它从第一列的名称(names)中删除了双引号。

修改你的 pcost.py 程序,以使用 csv 模块进行解析,然后尝试运行前面的示例。

练习 1.33:从命令行读取

pcost.py 程序中,输入文件的名称已经被硬编码到代码中:

# pcost.py

def portfolio_cost(filename):
    ...
    # Your code here
    ...

cost = portfolio_cost('Data/portfolio.csv')
print('Total cost:', cost)

虽然用于学习和测试还行,但在实际的程序中,你可能不会这么做。

相反,你可以把文件名作为参数传递给脚本。尝试按以下步骤修改程序的底部:

# pcost.py
import sys

def portfolio_cost(filename):
    ...
    # Your code here
    ...

if len(sys.argv) == 2:
    filename = sys.argv[1]
else:
    filename = 'Data/portfolio.csv'

cost = portfolio_cost(filename)
print('Total cost:', cost)

sys.argv 是一个列表,该列表包含了在命令行上传递的参数(如果有)。

要运行程序,你需要从终端(terminal)运行 Python。

示例,从 Unix系统中的 bash 运行:

bash % python3 pcost.py Data/portfolio.csv
Total cost: 44671.15
bash %

目录 | 上一节 (1.6 文件) | 下一节 (2.0 处理数据)

注:完整翻译见 https://github.com/codists/practical-python-zh

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

翻译:《实用的Python编程》01_07_Functions 的相关文章

  • 如何更改 FacetGrid 中的边距标题颜色

    使用 Seaborn Facet Grids 如何仅更改边距标题的颜色 注意g set titles color red 更改两个标题 p sns load dataset penguins sns displot data p x fli
  • 从 Django 调用 Postgres SQL 存储过程

    我正在开发一个带有 Postgresql 数据库的 Django 项目 我编写了一个可以在 Postgres 上完美运行的存储过程 现在我想从 Django 1 5 调用该存储过程 我已经编写了代码 但它提示错误 CREATE FUNCTI
  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 使用 Python 创建 MIDI

    本质上 我正在尝试从头开始创建 MIDI 并将它们放到网上 我对不同的语言持开放态度 但更喜欢使用Python 两种语言之一 如果这有什么区别的话 并且想知道我应该使用哪个库 提前致谢 看起来这就是您正在寻找的 适用于 Python 的简单
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • Pyqt-如何因另一个组合框数据而更改组合框数据?

    我有一个表 有 4 列 这 4 列中的两列是关于功能的 一个是特征 另一个是子特征 在每一列中 所有单元格都有组合框 我可以在这些单元格中打开txt 我想 当我选择电影院作为功能时 我只想看到子功能组合框中的电影名称 而不是我的 数据 中的
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 使用 NLTK 在 Python 中获取大量名词(或形容词);或 Python Mad Libs

    Like 这个问题 https stackoverflow com questions 7439555 noun adjective etc word lists or dictionaries common words 我有兴趣按词性获取
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 在 Spyder 的变量资源管理器中查看局部变量

    我是 python 新手 正在使用 Spyder 的 IDE 我欣赏它的一项功能是它的变量资源管理器 然而 根据一些研究 我发现它只显示全局变量 我找到的解决方法是使用检查模块 import inspect local vars def m
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • Flask 应用程序的测试覆盖率不起作用

    您好 想在终端的 Flask 应用程序中测试 删除路由 我可以看到测试已经过去 它说 test user delete test app LayoutTestCase ok 但是当我打开封面时 它仍然是红色的 这意味着没有覆盖它 请有人向我
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 如何使用Python保存“完整的网页”而不仅仅是基本的html

    我正在使用以下代码来使用 Python 保存网页 import urllib import sys from bs4 import BeautifulSoup url http www vodafone de privat tarife r

随机推荐

  • 第十三届蓝桥杯省赛 JAVA A组 - 矩形拼接

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 蓝桥杯题解集合 专栏定位 为想参加蓝桥杯的小伙伴整理常考算法题解 祝大家都能取得理想成绩 如果有收获的话 欢迎点
  • 【ChatGPT炒菜攻略】如何做韭菜

    ChatGPT可以化身为一名厨师 不仅有着扎实的厨艺基础和丰富的经验 而且也对食材的选取十分讲究 时常会寻找新鲜和有潜力的材料进行尝试和创新 从而创造出更加优秀和惊艳的佳肴 同时 我注重菜品的色 香 味 形均衡 追求将自然与文化相融合 以满
  • ip最长匹配mysql实现

    ip最长匹配计算 mysql使用inet aton函数实现 mask是ip的 select from select inet aton 10 181 88 1 inet aton mask inet aton prefix as match
  • Java程序跨平台原理

    平台 指的是操作系统 Windows Linux Mac 跨平台 Java程序可以在任一操作系统上运行 一次编写到处运行 原理 实现跨平台需要依赖Java的虚拟机JVM Java Virtual Machine Java程序 可以在Wind
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先
  • java读取Excel —— XSSFWorkbook 找不到该类

    做一个Excel表格的读取时导入 org apache poi 包后居然提示 XSSFWorkbook 找不到 原来是还需要下载一个jar包 poi ooxml 包 之后在引入相关类即可 import org apache poi xssf
  • Window XP驱动开发(二十四) 电源管理

    转载自 http blog csdn net xxxluozhen article details 5023703 一 电源管理 1 WDM电源管理模型 在Windows 2000和Windows 98中 操作系统接管了大部分电源管理工作
  • (数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法

    实验内容 1 编写一个程序graph cpp 设计带权图的邻接矩阵与邻接表的创建和输出运算 并在此基础上设计一个主程序exp8 1 cpp完成以下功能 1 建立如图8 54所示的有向图G的邻接矩阵 并输出之 2 建立如图8 54所示的有向图
  • 力扣:70. 爬楼梯

    假设你正在爬楼梯 需要 n 阶你才能到达楼顶 每次你可以爬 1 或 2 个台阶 你有多少种不同的方法可以爬到楼顶呢 示例 1 输入 n 2 输出 2 解释 有两种方法可以爬到楼顶 1 1 阶 1 阶 2 2 阶 示例 2 输入 n 3 输出
  • Boot与APP的Hex合并

    软件准备 使用的软件是srec cat软件 下载地址 合并脚本编写 ECHO OFF 如果存在上一次的hex文件就删除 if exist BootJoinAPP CCP APP hex del BootJoinAPP CCP APP hex
  • C# 远程唤醒(远程开机)

    C 远程唤醒 远程开机 近日 小白要用到远程开机的功能 网上大多介绍的是Magic Packet的工具 实际上 此Magic Packet是AMD公司开发的 请在google cn中搜索Magic Packet Technology 原理上
  • Mysql递归查询

    SELECT IFNULL CONCAT GROUP CONCAT CONCAT catId t id catName t name ch catLevel t level AS companyCategories FROM SELECT
  • 微服务实践--微服务方法论00

    思想 在接收到一个新的新项目时 架构师的职责是建立项目的业务与技术实现之间的桥梁 在翻译业务到技术实现的过程中需要进行业务建模 技术设计等方面的工作 业务建模和技术设计过程中都有各自领域的知识体系 基本上每个知识体系都是由上层的理论 概念和
  • python判断素数的函数_python判断是否为素数

    质数 prime number 又称素数 指在一个大于1的自然数中 除了1和此整数自身外 不能被其他自然数整除的数 素数在数论中有着很重要的地位 比1大但不是素数的数称为合数 1和0既非素数也非合数 素数是与合数相对立的两个概念 二者构成了
  • C++实现栈的顺序存储与链式存储

    栈是一种特殊的数据结构 栈中数据先进后出 且栈中数据只能从头部出栈 能直接访问的数据也仅为栈的头部数据 要想访问下面的数据则需要将前面的数据逐个出栈后才可访问 下面通过一个word撤销的案例来解释 我们用word写paper时 首先需要创建
  • 国内首部

    当前 税务和发票等财税数据作为财务关联性强 欺诈难度大 覆盖率最高的优质数据 正成为数字普惠金融不可或缺的 硬核 力量 全面提升相关数据理论与实战能力正逢其时 8月8日 在金蝶2023年全球创见者大会 企业数字信用平行论坛 现场 金蝶征信
  • java使用MD5生成摘要

    对value进行hash处理 return hash处理结果 public static String digest String input int length 32 try MessageDigest md MessageDigest
  • openGL之API学习(六十八)core profile、compatibility profile、forward compatibility

    在OpenGL的发展历程中 总是兼顾向下兼容的特性 但是到了一定的程度之后 这些旧有的OpenGL API不再适应时代的需要 还有一些扩展并不是驱动一定要实现的扩展 这些被统一划入可选的Compatibility Profile 而由Ope
  • 信号的时域相位、频域相位

    文章目录 傅里叶变换的时移性质 matlab代码 单点频信号 线调信号 时域相位 频域相位 傅里叶变换的时移性质 信号增加线性相位时 是所有的频率分量对应的相位都有变化 matlab代码 清空一切 clc clear all close a
  • 翻译:《实用的Python编程》01_07_Functions

    目录 上一节 1 6 文件 下一节 2 0 处理数据 1 7 函数 随着程序开始变大 我们会想要有条理地组织这些程序 本节简要介绍函数 库模块以及带有异常的错误处理 自定义函数 对你要重用的代码使用函数 下面是函数的定义方式 def sum