Skip to content

第6课 八十天环游地球——函数的使用

6.1 问题描述

《八十天环游地球》是法国作家儒勒•凡尔纳创作的一部长篇小说,讲述了这样一个神奇的故事。

在1872年的伦敦,英国绅士福格跟俱乐部的朋友以巨资打赌他能在80天实现环游地球。在人们的质疑中,他带着新雇佣的仆人“万事通”从伦敦出发了。一路上,他们乘坐的是邮轮、蒸汽火车、马车、大象等交通工具,还经历了密探追捕、恶僧捣乱、印第安人劫车、海浪肆虐……眼看约定的时间就要到了,福格竟然奇迹般地回到了伦敦。

福格的环球路线:伦敦——苏伊士——孟买——加尔各答——新加坡——中国香港——横滨——旧金山——纽约——伦敦,总行程约 40000 km。其中,走水路穿越地中海、红海、印度洋、太平洋和大西洋,行程约 32000 km;走陆路穿越法国、意大利、印度次大陆、北美大陆,行程约 8000km。

如果使用现在的交通工具重走一次福格环球路线,在理想情况下需要多少天?

请编写一个程序,只要输入水路和陆路的前进速度,就能计算出福格环球路线需要的时间。

6.2 算法分析

虽然福格的环球路线曲折复杂,时而坐轮船横渡大洋,时而乘火车穿越大陆,但是归纳起来就是水路和陆路两种。已知福格环球路线的水路行程约 32000 km、陆路行程约 8000 km,只要分别计算水路和陆路需要的时间,再把两者相加即可,使用如下公式表示:

$$ 环球时间=水路行程十水路速度+陆路行程+陆路速度 $$

这个程序要求水路和陆路的速度由外部输入。一般来说,外部输入指的是使用键盘输入数据,这样程序就能根据输入的数据进行运算,变得很灵活。

在 Python 语言中,print() 函数用于将数据输出到屏幕,input()函数用于接收用户从键盘输入的数据,int()函数用于将其他类型的数据转换为整数,str()函数用于将其他类型的数据转换为字符串……总之,各种各样的函数给编程带来极大的便利。

6.3 编程解题

有一个脑筋急转弯问题。问:怎么把一只大象放到冰箱里?答:第1步把冰箱门打 开;第2步把大象放进去;第3步把门关上(如图1所示)。

与此类似,编写程序通常可以分为3个步骤,即输入数据、处理数据和输出数据。下面将按这 3 个步骤进行编程,计算福格环球路线需要的时间。

在 IDLE 环境中,打开一个新的 Python 编辑器窗口,准备编写 Python 代码。

  1. 输入水路和陆路的前进速度。为了方便理解,速度用时速表示。在Python 编辑器中输入下面一行代码。
python
water speed= iiputC1请输入水路前进速度km/h:1)

在这行代码中,input() 函数会向计算机屏幕输出'字符串请输入水路前进速度 km/h:',用来提示用户输入约定的速度数据;当用户通过键盘输入数据后,需要按下回车键以表明输入结束。之后,input()函数会把用户输入的内容(不包括回车符)作为一个字符串赋给变量 water_speed。

将源代码以“环游地球.py”作为文件名保存到本地磁盘,然后运行程序。之后在 Python Shell 窗口中会出现提示信息“请输入水路前进时速km/h:”。这时从键盘输入一个数字(如 20 ),再按回车键表示输入结束。

python
>>>
======================= RESTART: c:/phython/环游地球.py =======================
请输入水路前进时速km/h:20
>>>

在 Python Shell 窗口中输入变量名 water_speed ,并按下回车键,可以看到这个变量值是字符串'20'

python
>>> water_speed
20

使用同样的方式,编写代码让用户输入陆路的前进速度。在 Python 编辑器中新起一行输入下面的代码。

python
land_speed= input(1请输入陆路前进速度km/h:,)

这样就完成了输入数据的步骤,变量 water_speed 和 land_speed 分别表示水路和陆路的前进时速,将用于后面的计算过程。

  1. 计算水路和陆路需要的时间。在Python编辑器中新起一行输入下面的代码。
python
water_speed= int(water_speed)
land_speed= int(land_speed)
hours = 32000/water_speed + 8000/land_speed

在这段代码中,使用 int() 函数分别将变量 water_speed 和 land_speed 巾字符串类型转换为整数类型,再将它们代入公式计算岀福格环游地球路线所需要的时间(单位为 h ),并将计算结果赋给变量 hours 。

为了便于理解,将时间换算为天数表示。在 Python 编辑器中新起一行输入下面的代码:

python
days = round(hours/24,1)

在这行代码中,使用 round() 函数对 hours / 24 的计算结果进行四舍五入,并保留1位 小数。至此,处理数据的步骤完成。

  1. 输岀福格环游地球路线所需要的时间。在 Python 编辑器中新起一行输入下面的代码:
python
print('按福格路线环游地球要' + str (days) + '1天')

在这行代码中,使用 str() 函数把整数类型的变量 days 转换得到一个字符串,再用加号 ( + )把儿个字符串拼接成为一个字符串,作为这个程序的处理结果。之后,使用print()函数将结果信息输出到屏幕。至此,输出数据的步骤也完成了。

经过输入数据、处理数据和输出数据3个步骤,就解决了福格环游地球路线所需时间 的计算问题。至此,这个程序编写完毕,见示例程序1。

python

#输入数据
water_speed = input('请输入水路前进时速 km/h:')
land_speed = input('请输入陆路前进时速 km/s:')

#处理数据
water_speed = int(water_speed)
land_speed = int(land_speed)
hours = 32000/water_speed + 8000/land_speed
days = round (hours/24, 1)

#输出数据
print('按福格路线环游地球要'+ str(days) + '1天')

将源代码编辑妥当并保存,然后运行程序进行测试。如果程序报错,请认真对照上面的程序清单进行检查,直到程序能够运行。

  1. 在现代交通条件下,计算重走福格环游地球路线需要的时间。选取水路和陆路前进速度分别为 50km/h 和 200km/h 的一组数据进行测试。计算结果如下:
python
>>>
======================= RESTART: c:/phython/环游地球.py =======================
请输入水路前进时速km/h:50
请输入陆路前进时速km/h:200
按福格路线环游地球要28.3天
>>>

小知识

在水路交通方面,一般的客运游轮航行速度约为 20km/h,便于乘客观看沿途风景;而远洋游轮的速度比较快,一般航速为 40〜70km/h 。在陆路交通方面,我国G字头的高速动车组最快时速超过 400km,—般平均运营时速约为 300km ,规定行驶速度不超过 300km/h;D字头的动车组最快时速为 200〜250km,一般平均运营速度约为 150km/h 。

6.4 常用函数

工欲善其事,必先利其器。Python 提供输入/输出、数学运算、随机数、文件操作、网络通信等各种各样的函数,给编程带来了极大的便利。编程者在使用函数时,不需要了解函数的内部实现,只要知道函数的用途和使用方法就可以了。

“函数”的思想在我们的日常生活中也有体现。例如,我们要制作一杯草莓果汁,可以找一台榨汁机(函数),放入草莓(参数),按下按钮让榨汁机工作(调用函数),然后等待片刻,就能得到一杯新鲜的草莓果汁(返回值)。在使用榨汁机时,不需要关心榨汁机的内部结构和工作机制,只要知道它的使用方法即可。

在前面的程序中已经使用了 print()、input()、round() 等几个常用函数,接下来将介绍数据类型转换、数学运算和随机数等几类 Python 中的常用函数。

  1. 数据类型转换

在 Python 语言中,支持使用整数(int)、浮点数(float)、字符串(str)和布尔类型(bool)等基木数据类型。如果要查看变量的数据类型,可以使用type()函数。如果要转换变量的数据类型,Python 语言也提供了进行数据类型转换的函数。

  • int()函数。int()函数用于将浮点数、布尔值或者是由数字( 0〜9 )构成的字符串转换为整数类型。例如:
python
>>> n=int(3.14)
>>> type(n), n
(< class 'int'>, 3)
>>> n=int(, 12345678901)
>>> type (n), n
(< class 'int'>, 1234567890)

int()函数默认用 10 进制转换数据,如果试图转换含有英文字母、特殊符号等非数字的字符串,则会报错。

  • float()函数。float()函数用于将整数、布尔值或者是由数字( 0〜9 )和小数点(.) 构成的字符串转换为浮点数类型。例如:
python
>>> f = float(123) 
>>> type(f), f
(< class 'float'>, 123.0)
>>> f = float('3.14') 
>>> type(f), f
(< class 'float'>, 3.14)

如果要转换的字符串中含有数字( 0〜9 )和小数点(.)之外的其他字符,则会报错。

  • str()函数。str()函数用于将整数、浮点数、布尔值等类型的数据转换为字符串 例如:
python
>>> s = str(12345)
>>> type(s), s
(< class 'str'>, '112345')
>>> s= str (3.14)
>>> type(s), s
(< class 'str'>, '3.14')
  • bool()函数。bool()函数用于将其他数据类型转换为布尔类型。
  1. 常用数学函数
  • round()函数。round()函数用于将一个浮点数作四舍五入,并返回一个近似值 例如:
python
>>> round(3.14)

如果需要指定保留小数的位数,可以在该函数的第2个参数中设定。例如,对浮点数 3.14159四舍五入,保留两位小数。代码如下:

python
>>> round(3.14159, 2)
3.14
>>>

但是,有时候在使用round()函数时,它返回的近似值可能并不是你想要的。例如:

python
>>> round (2.5)
2 
>>> round(2.675, 2)
2.67

简单地说,这是因为有些浮点数在计算机中并不能像整数那样被准确表达,它可能是近似值。解决这个问题有一个简单的办法,就是对要操作的数加上一个非常小的数再进行操作,例如:

python
>>> round (2.5 + 0.0000000001)
3 
>>> round (2.675 + 0.0000000001, 2)
2.68
  • abs()函数。abs()函数用于返回一个数的绝对值,和数学上的一致。例如:
python
>>> abs (0)
0 
>>> abs (3)
3 
>>> abs (- 3)
3
  • math模块中的常用数学函数。Python 语言为我们提供了丰富多样的函数,为了方便管理,将各种函数分门别类划分到不同的模块中。像三角函数、开方、对数运算等用于数学运算的函数放在一个名为 math 的内置模块中。常用的数学函数列表见表1

在使用math模块的函数之前,需要用 import math 语句将 math 模块导入到 Python 环境中。例如:

python
>>> import math
>>> math.ceil(3.14)
4
>>> math.floor(9.8)
9

在 Python 语言中,三角函数 sin()、cos()、tan() 等函数的参数使用孤度值,而不是角度值。在使用这些函数时,需要使用 radians() 函数把角度值转换为弧度值。例如:

python
>>> math.sin(math.radians(60))
0.8660254037844386

三角函数的反函数 asin()、acos()、atan() 等函数的返回值是弧度值,而不是角度值在需要的时候,可以使用 degrees() 函数把弧度值转换为角度值。例如:

python
>>> math.degrees(math.asin(0.866))
59.997089068811974
  1. 随机数

Python 语言内置的 random 模块提供了一些生成随机数的函数,在使用前先用 import random 语句导入random 模块。

  • 随机生成整数。使用 randint() 函数可以在指定范围内随机生成一个整数。例如:
python
>>> import randan
>>> randan.randint(1,10)
5

上面的代码会随机产生 1〜10 (包含 1 和 10 )中的一个整数。randint() 函数的参数必须是整数,不能是浮点数,否则会报错;下限必须小于或等于上限。

  • 随机生成浮点数。使用 random() 函数可以随机生成一个 0〜1 的浮点数,包括 0 但不包括 1 。例如:
python
>>> import randan
>>> randan.randan ()
0.8650763707025828

如果要在指定的范围内随机生成一个浮点数,可以使用 uniform() 函数。例如:

python
>>> import randan
>>> randan.uniform(1,10)
1.7329402093479744

上面的代码将在 1〜10 随机产生一个浮点数,包括 1 ,但不包括 10 。

  1. 时间函数

Python 内置的 time 模块提供了一些操作时间的函数,在使用前先用import time语句导入 time 模块。 使用 time() 函数,可以获取当前时间的时间戳。例如:

python
>>> import time
>>> time.time()
1543560628.925677

时间戳是自 1970 年 01 月 01 日 00 时 00 分 00 秒起经过的秒数,是一个浮点数。使用 sleep() 函数,可以让运行中的程序暂停一段时间(以秒(s)为单位)。例如:

python
>>> import time
>>> time.sleep(3)

在执行 time.sleep(3) 函数时,将使程序暂停 3s 。

想要了解更多时间函数,请浏览以下链接: http://www.runoob.com/python/python-date-time.html

最近更新