You are on page 1of 90

计算机程序设计基础 Python

清华大学计算机科学与技术系 乔 林
第一章 基本语法元素 Python
清华大学计算机科学与技术系 乔 林
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 3
计算机程序设计基础( Python ) 4
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 5
1.1  程序文本结构 6
1.1.2  注 释
1.1.3  缩 进
1.1.4  标识符与关键字
1.1.1  代码文本 1.1.5  编程风格
1.1.1  代码文本
• 代码文本:逻辑行与物理行
• Python 程序代码:一定数目的连续逻辑行
• 物理行
• ASCII / Unicode 文本行,行尾有换行标志
• 换行标志: Windows :‘ \r\n’ ; UNIX / Linux :‘ \n’ ;旧
Macintosh :‘ \r’ , Mac OS X :‘ \n’
• 逻辑行
• 单独物理行
• 按照显式或隐式的行合并规则合并的连续物理行
7
行合并规则
• 显式合并
• 显式合并方式:在行尾使用‘ \’ 结束本物理行,下一物理行自
动拼接到本行尾部,替换‘ \’ 及其后的换行符
• 注意事项:‘ \’ 必须为换行符前最后一个字符,其后不得书写
包括注释、空格在内的任何内容
• 隐式合并
• 隐式合并方式:小括号、中括号和大括号中的表达式可自由折
行,无语法限制
• 各物理行可随意添加注释,但使用空格和缩进要小心

8
1.1.2  注 释
• 注释( comment ):以‘ #’ 开始至本物理行结束的文本
序列
• 注释目的:增强程序代码可读性和可维护性
• 注释内容:版权信息、功能描述、编码规范等
• 编码规范: Python 脚本的编码格式
• Python 3.0 之后缺省格式为 UTF-8 ,使用此格式保存脚本文件
• 建议注释格式: # -*- coding: <encoding-name> -*-
• 注释位置:单独占据脚本第一行或第二行;占据第二行时,第一
行也必须为注释
9
1.1.3  缩 进
• 缩进( indent )目的:确定代码块或语句组的层次
• 缩进格式: Tab 键或固定数目的空格
• 缩进位置:逻辑行的行首,其他位置无所谓
• 建议使用两至四个空格作为缩进规范
• 缩退( dedent )与缩进必须匹配
• 不建议在单一脚本文件中混合使用空格和 Tab 键
• 一种关注: Python 独有特征,相当小清新
• 不符合缩进和缩退逻辑的代码文本行无法正确编译或执行

10
1.1.4  标识符与关键字
• 标识符( identifier )定义规则
• 使用 ASCII 字符集,以下划线和字母开头,后跟下划线、字
母和数字;标识符长度无限制,但区分大小写
• 标识符不得与系统关键字( keyword )相同
• 注意:不建议使用使用 Unicode 字符集定义标识符
• Python 3.0 之后合法,但容易导致不兼容问题
• 标识符示例
• Python 、 python 、 Deep_Thought 、 The_Ultimate_Question
、程序设计
11
1.1.4  标识符与关键字
• 关键字:保留字
• 定义:由系统预先定义,并有特殊意义的标识符
• 目的:与语言的语法结构、语义规则、语用环境紧密相关
• Python 3.6 关键字列表
and as assert break class continue def
del elif else except False finally for
from global if import in is lambda
None nonlocal not or pass raise return
True try while with yield
12
特定形式标识符
• 注意:特定形式标识符具有特殊意义
• 标识符 _* :在模块内部使用,不可通过 from
module import * 导入
• 标识符 _ :在 Python 交互模式下表示上一个表达式
的结果,在非交互模式下无特殊意义,且未定义
• 标识符 __*__ :系统定义的名称
• 标识符 __* :类私有的名称

13
1.1.5  编程风格
• 多注释:注释尽量占用单独文本行
• 缩进:建议行首缩进空格为四个,尽量不用 Tab 键
• 个人习惯为两个空格,缩进四个有点丑……
• 空格:逗号后与操作符间加空格,括号后不加空格
• 个人习惯在括号后加空格
• 理论上 Python 能处理多余空格,但有时会导致问题
• 换行:每行代码尽量不超过 79 个字符,有助于多窗
口代码比对

14
1.1.5  编程风格
• 使用空白行分隔函数定义、类定义与复杂语句块内部代
码,有助于增加代码可读性
• 使用文档字符串,有助于文档生成自动化
• 标识符命名规则统一
• 函数名全小写,单词间使用下划线
• 函数名应能完整准确描述其功能
• 尽量使用动词、动宾词组或系表结构命名函数,已形成历史惯例的例外
• 函数名尽量不要缩写,单词太长的例外,已形成历史惯例的例外
• 如果函数名依然太长,那不是命名的问题,是函数设计的问题

15
1.1.5  编程风格
• 标识符命名规则统一
• 类名首字母大写,单词间不加下划线
• 类名尽量不缩写;类的对象名应于类直观对应
• 变量名大小写均可,是否添加下划线均可
• 短程量(在代码文本中持续出现的场合较短)可简写
• 数学、物理等各学科专有量遵照各学科习惯
• 特殊量遵照 Python 习惯,在名称前后使用下划线
• 不要改变编码规范: UTF-8 或 ASCII 有助于代码移植
• 不要使用非 ASCII 字符:增加代码的跨语言可维护性
16
计算机程序设计基础( Python ) 17
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 18
1.2  对 象 19
1.2.1  型式与对象
1.2.2  文 字
1.2.3  量
1.2.4  赋 值
1.2.1  型式与对象
• 数据:需要处理或已经处理的信息
• 对象( object ):数据抽象
• Python 语言使用对象及对象间的关系描述全部数据
• 于 Python 而言,凡物皆对象
• 对象的三大基本特征
• 本征值( identity )
• 型式( type )
• 值( value )

20
本征值
• 本征值:用于区分不同对象的信息
• 实现方式: Python 表示对象本征值的方式与具体实现有关
• CPython 实现:对象本征值为其在内存中的存储地址
• 类比:人的身份证号码
• 本征值特征
• 唯一性、有常性(一经创设即无法变更)
• 本征值函数 id() :返回对象本征值
• 示例:在 Cpython 实现中, id(1) 、 id(object) 分别返回 1
与 object 的本征值
21
型 式
• 型式( type )
• 厘定对象可支持的操作集,定义其值域
• 注意: Python 为纯面向对象( object-oriented )语言,因此
在 Python 中,所有型式均为类( class )型式,简称类型
• 类:面向对象语言中的一种特殊型式
• 类型式意义:将对象属性( attribute )和行为( behavior )
统一描述和管理
• 对象的属性为其数据成员,对象的行为为该对象上可执行的操
作成员,后者也称为方法( method )
22
型 式
• 型式函数 type() :返回对象型式
• 示例:如 type(1) 、 type(1.1) 、 type("Python")
• 对象型式
• 型式用于构造该型式的对象,故任何对象都具有确定型式,一
般不可改变
• 凡是总有例外:有时确实可能改变对象型式;但请你——尽量
不要改变对象型式,否则容易导致奇怪的程序行为
• 示例: 1 为整数类型( int ), 1.1 为实数类型
( float ), "Python" 为字符串类型( str )
23
型 式
• ∵  凡物皆对象 ∴ 型式亦有相
• 型式同样也是 Python 中的对象
• 诡异( weired /uncanny )……
• 型式对象
• 函数 id() 与 type() :获取某个型式对象的本征值和型式
• 示例一: id(int) 返回整数类型对象的本征值
• 示例二: type(str) 返回字符串类型对象的型式

24

• 值:对象在程序运行期间保存的数据
• 无常对象( mutable ):值可能变更的对象
• 有常对象( immutable ) :值不能变更的对象
• 一种关注
• 对象无常性由其型式而定
• 数值( numeric )、字符串( string )和元组( tuple )为有常对象,
字典( dictionary )和列表( list )为无常对象
• 有常容器( container )对象可能包含无常元素对象,前者值不可变,
后者则不然;容器:包含对其他对象的引用的对象

25
1.2.2  文 字
• 文字( literal ):内置类型的有常值,类似常数
• 文字亦对象
• 文字种类
• 数值文字:整数文字、实数文字、复数文字
• 字符串文字
• 其他类型的文字
• 示例: 0 、 3.1416 、 2.71828j 、 "Python"

26
1.2.3  量
• 量( variable ):引用特定对象的标识符,类似代数
• 量与对象
• 量不是对象,而仅是对象的引用
• 真•对•象:对“对象”的“象”的引用
• 量是标识符,无型无款,只有对象才有型有款
• 款:钱,财产,对象的属性……
• 同一性( identity ):判定两个量是否引用同一对象
• 操作符: is 与 is not
• 示例: 1 is 1 与 a is b
27
1.2.3  量
• 一种关注
• Python 的量可以随意引用数值、字符串或其他类型的对象
• 类比: C/C++ 语言中的 void * 指针
>>> e = 1
>>> e
1
>>> e = 1.1
>>> e
1.1
>>> e = "Python is very interesting!"
>>> e
'Python is very interesting!'

28
1.2.4  赋 值
• 赋值( assignment )
• 格式:使用赋值操作符“ =” ,如 a = 1
• 连续赋值:合法且有效,如 a = b = 1
• 存在其他赋值手段,如函数参数传递
• 赋值即定义:未赋值量无定义
• 赋值语句目的
• 用于将名称( name )束定( bind )或重新束定到值上,以
修改无常对象的属性或值
• 名称可能是量或标识符,也可能是合法表达式( expression )
29
多变量赋值
• 多变量“同时”赋值:从左到右依次进行
• 格式:使用逗号分隔符,同时对多个变量赋值
• 示例: a, b, c = 1, 2, 3
• 多变量赋值优点:省略临时量的定义,简化代码
• 示例: a, b = b, a # 值互换
• 注意事项
• 不要对彼此无关的变量同时赋值

30
赋值与量同一性
• 一种关注
• 赋值与量同一性:依赖 Python 语言的具体实现(小心!)
• 示例一: a = 1 与 b = 1 是否引用值为 1 的同一有常对象存疑
• 示例二: a = [] 与 b = [] 总是引用不同无常对象(空列表)
• 示例三: a = b = [] 总是引用同一无常对象
• 建议:真诚地……
• 尝试执行后两张 PPT 中的命令,使用 id() 函数查看赋值后的量本征
值,使用 is 操作符查看它们是否引用同一对象
• 背景歌曲: As Times Goes by
• Casablanca (北非谍影, 1942 )(王力宏 《火力全开》版? 2011 )

31
赋值与量同一性示例
>>> 1 is 1 # 一是一,二是二

>>> a = 1
>>> id(a)
>>> b = 1
>>> id(b)
>>> a is b # 一就是一,二就是二?

>>> a = b
>>> id(a)
>>> id(b)
>>> a is b # 一就是一,二就是二!

32
赋值与量同一性示例
>>> 1.1 is 1.1 # 一带一是一带一,二带二是二带二

>>> c = 1.1
>>> id(c)
>>> d = 1.1
>>> id(d)
>>> c is d # 一带一不是一带一,二带二不是二带二……

>>> c = d
>>> id(c)
>>> id(d)
>>> c is d # 一带一就是一带一,二带二就是二带二!

33
型式对象赋值
• 一种关注
• 既然型式也是对象,那么如果对一个型式对象赋值……?
>>> id(int)
>>> type(int)
>>> id(float)
>>> type(float)
>>> int is float
>>> int = float
>>> id(int)
>>> type(int)
>>> id(float)
>>> type(float)
>>> int is float
34
计算机程序设计基础( Python ) 35
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 36
1.3  表达式 37
1.3.1  操作符与操作数
1.3.2  表达式求值
1.3.3  含参赋值语句
1.3.1  操作符与操作数
• 操作符( operator )与操作数( operand )
• 操作符:由数学符号、关键字等构成的计算逻辑
• 操作数:由文字、量、括号、函数调用等构成的计算对象
• 操作符分类
• 一元操作符:操作符只有一个操作数,如 -x (取负)
• 二元操作符:操作符有两个操作数,如 a + b (加法)
• 三元操作符:条件表达式
• 操作符优先级( precedence ):确定表达式计算顺序

38
操作符优先级
优先级 操作符 操作符描述
1 lambda Lambda 表达式
2 if-else 条件表达式
3 or 逻辑或
4 and 逻辑与
5 not x 逻辑非
6 in, not in, is, is not, <, <=, >, >=, !=, == 比较
7 | 位或
8 ^ 位异或
9 & 位与

39
操作符优先级
优先级 操作符 操作符描述
10 <<, >> 移位
11 +, - 加减
12 *, @, /, //, % 乘除模
13 +x, -x, ~x 正负与位反
14 ** 幂
15 await x 等待表达式
16 x[idx], x[idx:idx], x(arg...), x.attr 下标、调用与属性

17 (expr...), [expr...], {key: value...}, {expr...} 束定、元组、列表、字典、


集合显示

40
1.3.2  表达式求值
• 表达式:由操作符和操作数构成的计算序列
• 表达式求值:一般计算规则与特殊约定
• 表达式计算示例一:一般计算规则
>>> width = 5.0
>>> height = 4.0
>>> width * height
20.0
>>> length = 2.0
>>> volume = length * _ # _ 表示上一表达式结果,值为 20.0
>>> volume
40.0
41
表达式求值示例
• 表达式计算示例二:一般计算规则
>>> a = 1
>>> b = 2
>>> c = 3
>>> d = a + b * c
>>> d
7
>>> e = a * (b + c)
>>> e
5

42
表达式求值示例
• 表达式计算示例三:特殊约定
>>> a = 1
>>> b = 2
>>> c = 3
>>> d = a + -b ** c # 先计算 b ** c ,再计算取负,最后是加法
>>> d
-7
>>> e = b ** -c # 先计算取负,再计算 b ** ( -c )
>>> e
0.125

43
1.3.3  含参赋值语句
• 基本格式
• 加赋“ +=” : a += b 类似于 a = a + b
• 减赋“ -=” : a -= b 类似于 a = a - b
• 其他:乘赋“ *=” 与“ @=” ;除赋“ /=” 与“ //=” ;余赋
“ %=” ;幂赋“ **=” ;移位赋“ <<=” 与“ >>=” ;位赋
“ &=” 、“ <=” 与“ >=”
• 注意事项
• 实施此类操作前,右侧子表达式需计算完毕
• 示例: a *= b + c 类似于 a = a * (b + c)
44
计算机程序设计基础( Python ) 45
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 46
1.4  数值类型 47
1.4.3  复数类型
1.4.4  数值运算
1.4.1  整数类型 1.4.5  内置数值函数
1.4.2  实数类型 1.4.6  幂运算与模运算
1.4.1  整数类型
• 整数类型: int
• 整数取值范围:正负无穷大
• 实际取值范围受限于计算机内存容量
• 整数表示:除十进制,一般无正负号(有亦合法)
• 二进制:“ 0B” 或“ 0b” 起始 0 ~ 1 序列,如 0b0101
• 八进制:“ 0O” 或“ 0o” 起始 0 ~ 7 序列,如 0o2017
• 十进制:普通整数表示,如 1812
• 十六进制:“ 0X” 或“ 0x” 起始 0 ~ 9 、 A/a ~ F/f 序列,
如 0xABADCAD
48
整数分节
• 注意: Python 3.6 以后适用
• 允许使用下划线对数字进行分节,以增强可读性
• 所有数值型均适用
• 整数分节
• 示例:
0b_10_100_100 、 0O0_2_000 、 1949_2049 、 1.000_000_001
、 1.111_111 + 9.999_999j 、 0x_DECADE_CAFE

49
1.4.2  实数类型
• 实数(浮点数)类型: float
• 实数表示:使用小数点区分整数与实数
• 普通表示法:如 -2.71828 、 2. 、 .101
• 科学计数法:以“ E” 或“ e” 连接尾数与指数部分,以 10
为基底,如 6.18034e-1 为 0.618034
• 实数取值范围
• 最大值 1.7976_9313_4862_3157e+308
• 最小值 2.2250_7385_8507_2014e-308

50
实数表示误差
• 实数表示误差
• 有效数字 16 位,精确数字 15 位
• 存在误差,最小差值为 2.2204_4604_9250_313e-16
• 实数运算示例
>>> 1.1 + 2.2
3.3000000000000003
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17

• 实数精确表示: decimal 模块
51
1.4.3  复数类型
• 虚数:实部为 0.0 的复数
• 虚数取值范围:与实数同
• 虚数表示:整数或实数后添加“ J” 或“ j” 后缀
• 复数类型: complex
• 复数表示: a + bj ,实部和虚部均为浮点数
• 对于复数 c , c.real 和 c.imag 分别为其实部和虚部
>>> 1.23 + 4.56j.imag
5.789999999999999
>>> (1.23 + 4.56j).imag
4.56
52
1.4.4  数值运算
• 四则运算及相关操作符
• “+” :加法
• “-” :减法
• “*” :乘法
• “/” :除法
• “//” : Python 3.0 之后,整数除法
• “%” :整数模运算(取余)
• “**” :幂运算

53
1.4.4  数值运算
• 符号运算操作符
• “+” :一元操作符,对象本身
• “-” :一元操作符,改变对象的正负号
• 移位运算操作符:仅适用于整数
• “<<” :左移,左移一位相当于倍乘
• 示例: 2017 << 3 等价于 2017 * 2 ** 3 ( 16136 )
• “>>” :右移,右移一位相当于折半,结果为整数
• 示例: 2017 >> 10 等价于 2017 // 2 ** 10 ( 1 )

54
1.4.4  数值运算
• 位运算操作符:仅适用于整数
• “|” :位或,二进制逐位取或(全 0 为 0 ,其他为 1 )
• 示例: 0b0101 | 0b1001 结果为 0b1101 ( 13 )
• “^” :位异或,二进制逐位取异或(相同为 0 ,相异为 1 )
• 示例: 0b0101 ^ 0b1001 结果为 0b1100 ( 12 )
• “&” :位与,二进制逐位取与(全 1 为 1 ,其他为 0 )
• 示例: 0b0101 & 0b1001 结果为 0b0001 ( 1 )
• “~” :位反,二进制逐位取反( 1 变 0 , 0 变 1 )
• 示例: ~0b0101 结果为 0b1010 ( -6 )(前提:四位二进制整数)
• 位反规律: n + ~n = -1 (与负数表示有关)
55
1.4.5  内置数值函数
• 数值类型转换函数
• 函数 int(x) :浮点数或字符串转换为整数
• 转换时不四舍五入,小数部分直接舍弃
• 函数 float(x) :整数或字符串转换为浮点数
• 函数 complex( re[, im]) :合成复数
• 实部 re 可为整数、浮点数和字符串
• 虚部 im 可选,若存在则可为整数或浮点数,不可为字符串
• 复数不可直接转换为整数或浮点数;但可使用 c.real 与 c.imag 获得
复数 c 的实部与虚部后再参与转换

56
1.4.5  内置数值函数
• 数值表示转换函数
• 函数 bin(x) :将整数 x 转换为二进制字符串,有“ 0b” 前

• 函数 hex(x) :将整数 x 转换为小写十六进制字符串,
有“ 0x” 前缀
• 浮点数转换:使用方法 float.hex(x)
• 函数 oct(x) :将整数 x 转换为八进制字符串,有“ 0” 前缀
( Python 3.0 之前)或“ 0o” 前缀( Python 3.0 之后)
• 转换为十进制:使用函数 int() 与 float()

57
1.4.5  内置数值函数
• 数值运算函数
• 函数 abs(x) :返回 x 的绝对值
• 函数 divmod(x, y) :求商与余,值为二元组 (x // y, x % y)
• 函数 max(x1, x2, ..., xn) :求最大值,数据数目无限制
• 函数 min(x1, x2, ..., xn) :求最小值,数据数目无限制
• 函数 pow(x, y[, z]) :返回 x 的 y 次幂,提供参数 z 时,
求 x ** y % z 的结果
• 函数 round(x[, n]) :返回 x 的四舍五入值,提供参数 n 时,
保留 n 位小数
58
1.4.6  幂运算与模运算
• 超大整数的幂运算:结果精确,速度极快
>>> pow(2, 2020)
120390229192789671200196730675808906407818580678535565853
604471040981468330576609422256057752381687848600439581729
091776513008621150593910720527739772380453052486767498034
969314002237284144953291103458547532810152608127216408475
325114421897897408047581395677670971695493487923933346069
636224032935216763561673143257907287561970520670661943292
226106584203713841952673366886865445199267790891789863232
017223226748196794533959989836805876911810211481167739679
043319937687835412885323948134322098370385629943305785136
881090458653857068542385988740344220360507575957485047851
613181253218943644136742478444626968576L
59
1.4.6  幂运算与模运算
• 超大整数的幂与模混合运算:结果精确,速度极快
>>> pow(2, 20, 10000)
8576
>>> pow(2, 64, 10000)
1616
>>> pow(2, 2017, 10000)
1072
>>> pow(3, pow(5, 1000), 10000)
5443
>>> pow(3, pow(5, 1000)) % 10000
# 分开计算效率极低,请耐心等待结果,或者 power off (趴窝偶服)……

60
计算机程序设计基础( Python ) 61
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 62
1.5  数学模块 63
1.5.1  数学模块用法
1.5.2  数学常数
1.5.3  数学函数
1.5.1  数学模块用法
• 数学模块 math : Python 内置模块,含常数与函数
• 引用:不能直接引用数学模块中的标识符,必须事先导入
• 局限:只能处理整数与实数,处理复数的数学模块为 cmath
• 数学模块导入:关键字 import 和 from
• 格式 import math :导入数学模块,模块中所有标识符使用类
似 math.pi 格式解析
• 格式 from math import pi :从数学模块导入标识符 pi ,引
用时即不需也不能使用模块名限定
• 格式 from math import * :从数学模块导入全体可导标识符

64
1.5.2  数学常数
• 自然对数 math.e :值为 2.718281828459045
• 正无穷大 math.inf 与负无穷大 -math.inf
• 前者等价于输出 float("inf") ; Python 3.5 引入
• 非数标志 math.nan
• 等价于输出 float("NaN") ; Python 3.5 引入
• 圆周率 math.pi :值为 3.141592653589793
• 倍圆周率 math.tau :值为 6.283185307179586
• Python 3.6 引入

65
1.5.3  数学函数
• 数论与数值表示函数
• 函数 math.ceil(x) :向上取整
• 函数 math.copysign(x, y) :用 y 的正负号替换 x 的符号
• 函数 math.fabs(x) :返回 x 的绝对值
• 函数 math.factorial(x) :求阶乘, x 为负数或小数时返回
ValueError 异常
• 函数 math.floor(x) :向下取整
• 函数 math.fmod(x, y) :返回 x % y 的值
• 函数 math.frexp(x) :返回二元组 (k, i) , x = k * 2 ** i
66
1.5.3  数学函数
• 数论与数值表示函数
• 函数 math.fsum([x1, x2, ..., xn]) :精确求和
• 函数 math.gcd(x, y) :求 x 、 y 最大公约数
• 函数 math.isclose(x, y) :比较 x 、 y 是否近似相等,返回
True 或 False
• 函数 math.isfinite(x) :当 x 非无穷大,也不是非数标志时
返回 True ,否则返回 False
• 函数 math.isinf(x) :当 x 为正负无穷大时返回 True ,否
则返回 False

67
1.5.3  数学函数
• 数论与数值表示函数
• 函数 math.isnan(x) :当 x 为非数标志时返回 True ,否则返
回 False
• 函数 math.ldexp(x, i) :返回 x * 2 ** i ,函数 math.frexp(x)
的逆运算
• 函数 math.modf(x) :以二元组形式返回 x 的小数与整数部分
• 函数 math.trunc(x) :返回 x 的整数部分
• 指数与对数函数
• 函数 math.exp(x) :返回 e ** x

68
1.5.3  数学函数
• 指数与对数函数
• 函数 math.expm1(x) :返回 e ** x - 1
• 函数 math.log(x[, base]) :返回 x 对数,基底为 base 或
math.e
• 函数 math.log1p(x) :返回 1 + x 自然对数
• 函数 math.log2(x) :返回 x 对数,基底为 2
• 函数 math.log10(x) :返回 x 对数,基底为 10
• 函数 math.pow(x, y) :返回 x ** y
• 参数需转换为实数,不如内置“ **” 操作符和 pow() 函数精确

69
1.5.3  数学函数
• 指数与对数函数
• 函数 math.sqrt(x) :返回 x 平方根
• 三角与反三角函数
• 函数 math.acos(x) :返回反余弦值,弧度单位
• 函数 math.asin(x) :返回反正弦值,弧度单位
• 函数 math.atan(x) :返回反正切值,弧度单位
• 函数 math.atan2(y, x) :返回 y / x 反正切值,弧度单位
• 函数 math.cos(x) :返回余弦值,弧度单位
• 函数 math.degrees(x) :弧度值转换为角度值
70
1.5.3  数学函数
• 三角与反三角函数
• 函数 math.hypot(x, y) :返回平面向量的模长
• 函数 math.radians(x) :角度值转换为弧度值
• 函数 math.sin(x) :返回正弦值,弧度单位
• 函数 math.tan(x) :返回正切值,弧度单位
• 双曲与与反双曲函数
• 函数 math.acosh(x) :返回反双曲余弦值
• 函数 math.asinh(x) :返回反双曲正弦值
• 函数 math.atanh(x) :返回反双曲正切值
71
1.5.3  数学函数
• 双曲与与反双曲函数
• 函数 math.cosh(x) :返回双曲余弦值
• 函数 math.sinh(x) :返回双曲正弦值
• 函数 math.tanh(x) :返回双曲正切值
• 特殊函数: Python 3.2 引入
• 函数 math.erf(x) :高斯误差函数
• 函数 math.erfc(x) :互补高斯误差函数
• 函数 math.gamma(x) :伽马函数
• 函数 math.lgamma(x) :伽马函数绝对值的自然对数
72
数学模块示例
• 数学模块函数调用示例
>>> import math
>>> math.factorial(128)
385620482362580421735677065923463640617493109590223590278
828403276373402575165543560686168588507361534030051833058
916347592172932262498857766114955245039357760034644709279
247692495585280000000000000000000000000000000L
>>> math.erf(1)
0.842700792949715
>>> math.erfc(1)
0.157299207050285

73
计算机程序设计基础( Python ) 74
1.1  程序文本结构
1.2  对 象
1.3  表达式
1.4  数值类型
1.5  数学模块
1.6  基本输入输出

第一章 基本语法元素 75
1.6  基本输入输出 76
1.6.1  输入输出简介
1.6.2  输出命令与函数
1.6.3  输入函数
1.6.4  求值函数
1.6.1  输入输出简介
• Python 输入输出:以字符串为媒介
• 数据型式:无论整数、实数,还是其他对象,均以字符串类型
输入输出,由程序员手动或由程序自动转型为其他类型对象
• 字符串基本格式:双引号、单引号(两者均不可跨行)或连续
三个引号(单、双引号均可,可跨行)封装的字符序列
• 基本输出功能
• 命令 print 或函数 print() :功能相同,格式不同
• 基本输入功能
• 函数 input() 、 raw_input() 、 eval()
77
1.6.2  输出命令与函数
• 函数 print() 基本用法
• 格式: print(*objects, sep = " ", end = "\n", file = sys.stdout,
flush = False)
• 功能:输出对象的字符串信息
• 描述:将 objects 引用的全部对象转换为字符串输出到文本
流文件 file 中,对象间以字符串 sep 分隔,输出完毕后使
用字符串 end 结尾;无 sep 和 end 参数或参数为 None
时,使用空格分隔对象,结尾换行

78
1.6.2  输出命令与函数
• 函数 print() 基本用法
• 未指定文件参数 file 或参数值为 None 时,输出到标准输出
流 sys.stdout (一般为屏幕)
• 输出文件是否有缓冲与文件参数 file 表示的对象有关;如果
参数 flush 值为 True ,流强制刷新
• 函数 print() 的基本用法示例
• 输出字符串: print("Hello World!")
• 输出复数: print(complex(1.0, 2.0))

79
命令还是函数?这是个问题
• 一种关注:极为小清新!
• 切记:切忌混用命令 print 与函数 print()
• 函数 print() 由 Python 2.6 引入,参数 flush 由 Python
3.3 引入
• Python 3.0 之后:使用函数形式输出
• Python 3.0 之前:使用命令形式输出
• Python 2.6 之后, 3.0 之前:为避免与 print 命令冲突,可
以在模块头部使用语句 from __future__ import
print_function 禁用输出命令,导入函数 print()

80
输出函数示例
• 函数 print() 调用示例
# 第 0.5.3 节示例,格式化输出数据
print('Hi, %s!' % name)

# 第 0.5.4 节示例,多参数连续输出
print('The product is:', product)

# 第 0.5.5 节示例,输出空格分隔的数字
print(a, end = ' ')
# 第 0.5.5 节示例,换行
print()

81
1.6.3  输入函数
• 函数 input() 与 raw_input() 基本用法
• 格式: input([prompt]) 与 raw_input([prompt])
• 功能:读取用户输入
• 描述:参数 prompt 表示提示信息;如果其存在,则在获取
用户输入前输出
• 一种关注: triste again!
• Python 3.0 之后, raw_input() 已废弃, input() 的意义发生
变化,完成 raw_input() 功能

82
1.6.3  输入函数
• 函数 input() 与 raw_input() 重要差异
• Python 3.0 之前,两者都接受字符串、数字、表达式输入
• 输入为字符串: raw_input() 读取控制台输入,返回字符串; input()
输入字符串时必须使用引号,否则会报错
• 输入为纯数字: raw_input() 读取控制台输入,返回字符串; input()
读取控制台输入,返回数值
• 输入为字符串表达式: raw_input() 读取控制台输入,返回字符串;
input() 读取控制台输入,对合法的 Python 数学表达式进行计算,返
回计算后的结果
• 输入为特殊字符: raw_input() 读取控制台输入,返回字符串;
input() 读取控制台输入,输入字符串需要引号
83
输入函数示例
• 函数 input() 与 raw_input() 调用示例
# Python 3.0 之前
# 函数 raw_input()
>>> e1 = raw_input('Please input a special char: ')
Please input a special char: \t
>>> e1
'\\t'
# 函数 input()
>>> e2 = input('Please input a special char: ')
Please input a special char: '\t'
>>> e2
'\t'

84
输入函数示例
# 函数 input()
>>> e3 = input('Please input a special char: ')
Please input a special char: \t
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
\t
^
SyntaxError: unexpected character after line continuation
character
>>>

85
1.6.4  求值函数
• 函数 eval() 基本用法
• 格式: eval(expression, globals = None, locals = None)
• 功能:表达式求值
• 描述:参数 expression 为字符串,函数 eval() 将其作为
Python 表达式进行分析和求值,并返回其结果;如果无参数
globals 与 locals , expression 在函数 eval() 调用环境中执
行,语法错误将报告为异常

86
求值函数示例
• 函数 eval() 调用示例
>>> counter = 1
>>> eval('counter + 1')
2
# Python 3.0 之后
>>> n = eval(input('A number: '))
# Python 3.0 之前
>>> n = eval(raw_input('A number: '))
# 以上两条语句只能根据 Python 的不同版本二选一
A number: 1024
>>> print(n * 2)
2048

87
输入输出示例:浮点数平方根之和
• 接受用户输入的两个实数,求两者平方根之和。
# sqrtreal.py
# 平方根函数需要使用数学库,导入之
import math
# 获取用户的输入
a = eval(input("The first real: "))
b = eval(input("The second real: "))
# 计算
r = math.sqrt(a) + math.sqrt(b)
# 输出结果
print("The result is ", r)

88
计算机程序设计基础( Python ) 89
作 业 90
• 习题一 接受两个数,一个为用户一年期定期存款本金,一个为一年期定期
存款利率。计算一年期满后本金与利息总额。说明:( 1 )存款金额以人民
币元为单位;( 2 )输入利率时不需要输入百分号,例如一年期定期存款年
利率为 2.52% ,用户输入 2.52 即可。
• 习题二 现实生活中,储户在填定期存单时有“到期自动转存”选项,它表
示在存单期满后自动转存为同样存期的新定期存单,结存的本金与利息总额
将作为新本金。计算自动转存一次和两次后的期满金额。
• 习题三 接受用户输入的两个整数,求其阶乘之和并输出结果。 

You might also like