Python基础教程第3版:引言 | 第1章 快速上手 — 基础知识

Python基础教程(第3版 修订版),Magnus Lie Hetland, 人民邮电出版社,出版时间:2018年.

以下笔记使用Python3.x版本测试.

引言

C程序犹如拿着剃刀在刚打过蜡的地板上劲舞。 ——Waldi Ravens

C++学起来很难,因为它天生如此。——佚名

Java从很多方面来说,就是简化版的C++。——Michael Feldman

虽然Python的速度可能没有C、C++等编译型语言那么快,但它能够节省编程时间。如果你是C语言程序员,那么你可轻松地使用C语言实现程序的重要部分,再将其与Python部分整合起来。使用 NumPy等库可以解决需要高性能的场景, 如果依然满足不了, 可以考虑用C语言编写部分功能.

第1章 快速上手:基础知识

python3中, 默认整数除法 / 结果为浮点数, 使用 // 会向下取整.

>>> 1//3
0
>>> 1/3
0.3333333333333333
>>> 1/2
0.5
>>> 1//2
0
>>> 2/3
0.6666666666666666
>>> 2//3
0
>>> -1//2
-1
>>> -2//3
-1
>>> -4/3
-1.3333333333333333
>>> -4//3
-2

求余(摸除)运算符为 %, 计算公式为 r=a-n*[a//n], 这里r是余数,a是被除数,n是除数, a//n 会向下取整

>>> 10%3
1
>>> -10%3
2
>>> -10 - 3*(-10//3)
2
>>> 2.75%0.5
0.25
>>> -2.75%0.5
0.25
>>> -2.75 - 0.5*(-2.75//0.5)
0.25

十六进制、八进制和二进制数的表示:这些表示法都以0打头,分别用0x,0o,0b开头

  • 十六进制: Hexadecimal
  • 八进制: Octal
  • 二进制: Binary
>>> 0xAF
175
>>> 0Xaf
175
>>> 0o10
8
>>> 0O10
8
>>> 0b1011010010
722
>>> 0B1011010010
722

input函数, 获得的输入实际为字符串.

>>> a= input("your age:")
your age:rr
>>> a
'rr'
>>> a= input("your age:")
your age:12
>>> a
'12'

幂运算符号 ** , 可以用内置函数 pow() 替代:

>>> 2**0.5
1.4142135623730951
>>> pow(2,0.5)
1.4142135623730951

round截断函数

round 函数对浮点数进行近似取值,保留几位小数, 默认零位小数. round 函数不是四舍五入的, round圆整到最接近的整数,并在两 个整数一样近时圆整到偶数,具体参考:

>>> round(0.5)
0
>>> round(-0.5)
0
>>> round(1.5)
2
>>> round(1.4)
1
>>> round(-1.4)
-1
>>> round(-1.5)
-2

python的地板除法 math.floor() 和天花板除法 math.ceil() : 向下取整函数和向上取整函数.

>>> import math
>>> math.floor(18/10)
1
>>> math.floor(-18/10)
-2
>>> math.ceil(8/10)
1
>>> math.ceil(-8/10)
0

求平方根函数 sqrt , 不能处理负数, cmath (complex math) 负数模块中的 sqrt 函数可以. 复数可以用来表示向量值, 比如物理学中的动量.

可使用变量来引用函数(以及其他大部分Python元素)。执行赋值语句 foo =math.sqrt 后,就可使用foo来计算平方根。

>>> math.sqrt(4)
2.0
>>> math.sqrt(-4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> import cmath
>>> cmath.sqrt(-4)
2j
>>> foo = math.sqrt
>>> foo(4)
2.0

在Python3中, 所有的字符串都是Unicode字符串.

字符串表示str 和repr

实际上,像int一样,str也是一个类,但repr是一个函数。

  • 使用str能以合理的方式将值转换为用户能够看懂的字符串。例如,尽可能将特殊字符编码转换为相应的字符。
  • 然而,使用repr时,通常会获得值的合法Python表达式表示。
>>> s1 = str("Hello,\nworld!")
>>> s2 = repr("Hello,\nworld!")
>>> s1
'Hello,\nworld!'
>>> s2
"'Hello,\\nworld!'"
>>> print(s1)
Hello,
world!
>>> print(s2)
'Hello,\nworld!'
>>>

长字符串、原始字符串和字节

  • 长字符串:使用三引号 '''"""
  • 原始字符串(有很多限制):不会对反斜杠做特殊处理转义,而是让字符串包含的每个字符都保持原样. 用r表示原始字符串,如果字符串中包含引号,转义会出现问题,因为不会执行转义,字符串也不能以单个反斜杠结尾
  • 字节:参考 Unicode、bytes和bytearray 部分
>>> print(r'Let\'s go!')
Let\'s go!
>>> print(r'C:\nowhere')
C:\nowhere
>>> print(r'C:\nowhere\')
  File "<stdin>", line 1
    print(r'C:\nowhere\')
                        ^
SyntaxError: EOL while scanning string literal

Unicode、bytes和bytearray

  • Python字符串使用Unicode编码来表示文本。对大多数简单程序来说,这一点是完全透明的
  • 每个Unicode字符都用一个码点(code point)表示,而码点是Unicode标准给每个字符指定的数字。这让你能够以任何现代软件都能识别的方式表示129个文字系统中的12万个以上的字符
  • 鉴于计算机键盘不可能包含几十万个键,因此有一种指定Unicode字符的通用 机制:使用16或32位的十六进制字面量(分别加上前缀 \u\U)或者使用字符的Unicode名称(\N{name})。这样指定Unicode字符的通用机制就有三种:

  • 前缀 \u:16 位的十六进制字面量

  • 前缀 \U:32 位的十六进制字面量
  • \N{name}:使用字符的Unicode名称

以下示例代码在默认的windows命令行下显示异常, 因为目前的windows console不支持 emoji. 可以在 Windows Terminal Preview 下运行.

>>> "\u00C6"
'Æ'
>>> "\U0001F60A"
'😊'
>>> "This is a cat: \N{Cat}"
'This is a cat: 🐈'
>>> "\U0001F408"
'🐈'

要获悉字符的Unicode码点和名称可以在类似 https://unicode-table.com/en/ 这样的网站上搜索相关的字符, 比如搜索Cat 可以得到 Cat Emoji 的:

  • Name Cat
  • UTF-32BE 00 01 F4 08, 即: "\U0001F408"

在内存和磁盘中,所有对象都是以二进制数字(0和1)表示的(这些数字每8个为一组,即1字节),字符串也不例外。

在诸如C等编程语言中,这些字节完全暴露,而字符串不过是字节序列而已。

为与C语言互操作以及将文本写入文件或通过网络套接字发送出去,Python提供了两种类似的类型:不可变的bytes和可变的bytearray。

如果需要,可直接创建bytes对象(而不是字符串),方法是使用前缀b. 然而,1字节只能表示256个不同的值,离Unicode标准的要求差很远。Python bytes字面量只支持ASCII标准中的128个字符,而余下的128个值必须用转义序列表示,如\xf0表示十六进制值0xf0(即240)。

超过1字节后,直接将每个码点表示为相应的二进制数可能不再可行:不仅存在字节顺序的问题(即便对整数值进行编码,也会遇到这样的问题),而且还可能浪费空间。

一种非常巧妙的替代方式:不使用全部32位,而是使用变长编码,即对于不同的字符,使用不同数量的字节进行编码:

  • 进行单字节编码时,依然使用ASCII编码,以便与较旧的系统兼容;
  • 但对于不在这个范围内的字符,使用多个字节(最多为6个)进行编码。

下面来使用ASCII、UTF-8和UTF-32编码将字符串转换为bytes(使用前两种编码的结果相同,但使用最后一种编码的结果长得多):

>>> "Hello, world!".encode("ASCII")
b'Hello, world!'
>>> "Hello, world!".encode("UTF-8")
b'Hello, world!'
>>> "Hello, world!".encode("UTF-32")
b'\xff\xfe\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00,\x00\x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d\x00\x00\x00!\x00\x00\x00'

如果字符不在指定的编码范围内, 会报错:

>>> "你好".encode("ASCII")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

对于可能出现的错误的处理方式, 可以通过 encode 的第二个参数传递,默认为 strict, 具体说明:

Help on built-in function encode:

encode(encoding='utf-8', errors='strict') method of builtins.str instance
    Encode the string using the codec registered for encoding.

    encoding
      The encoding in which to encode the string.
    errors
      The error handling scheme to use for encoding errors.
      The default is 'strict' meaning that encoding errors raise a
      UnicodeEncodeError.  Other possible values are 'ignore', 'replace' and
      'xmlcharrefreplace' as well as any other name registered with
      codecs.register_error that can handle UnicodeEncodeErrors.

示例代码:

>>> "Hællå, wørld!".encode("ASCII", "ignore")
b'Hll, wrld!'
>>> "Hællå, wørld!".encode("ASCII", "replace")
b'H?ll?, w?rld!'
>>> "Hællå, wørld!".encode("ASCII", "backslashreplace")
b'H\\xe6ll\\xe5, w\\xf8rld!'
>>> "Hællå, wørld!".encode("ASCII", "xmlcharrefreplace")
b'H&#230;ll&#229;, w&#248;rld!'

几乎在所有情况下,都最好使用UTF-8。事实上,它也是默认使用的编码。

可将字符串编码为bytes,同样也可将bytes解码为字符串:

>>> "Hællå, wørld!".encode()
b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!'
>>> b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!'.decode()
'Hællå, wørld!'

decode默认编码也是UTF-8。你可指定其他编码,但如果指定的编码不正确,将出现错误消息或得到一堆乱码。bytes对象本身并不知道使用的是哪种编码,因此你必须负责跟踪这一点。

可不使用方法encode和decode,而直接创建bytes和str(即字符串)对象:

>>> bytes("您好",encoding="utf-8")
b'\xe6\x82\xa8\xe5\xa5\xbd'
>>> bytes("您好",encoding="UTF-8")
b'\xe6\x82\xa8\xe5\xa5\xbd'
>>> str(b'\xe6\x82\xa8\xe5\xa5\xbd',encoding="utf-8")
'您好'

编码和解码的最重要用途之一是,将文本存储到磁盘文件中。然而,Python提供的文件读写机制通常会替你完成这方面的工作!只要文件使用的是UTF-8编码,就无需操心编码和解码的问题。

但如果原本正常的文本变成了乱码,就说明文件使用的可能是其他编码。这在抓取网页内容时经常出现.想更详细地了解Python中的Unicode,请参阅在线文档Unicode HOWTO

Python还提供了bytearray,它是bytes的可变版。从某种意义上说,它就像是可修改的字符串(常规字符串是不能修改的). bytearray作为类字符串使用时对用户并不友好。

本章的函数(方括号内的参数是可选的)

类别 函数 描述
输入输出 input(prompt) 以字符串的方式获取用户输入
输入输出 print(object, ...) 将提供的实参打印出来,并用
空格分隔
输入输出 help([object]) 提供交互式帮助
类型转换 float(object) 将字符串或数字转换为浮点数
类型转换 int(object) 将字符串或数转换为整数
字符串 bytes(string, encoding[, errors]) 对指定的字符串进行编码,并
以指定的方式处理错误
字符串 str(object) 将指定的值转换为字符串。用
于转换bytes时,可指定编码和
错误处理方式
字符串 repr(object) 返回指定值的字符串表示
数学 abs(number) 返回指定数的绝对值
数学 cmath.sqrt(number) 返回平方根;可用于负数
数学 math.ceil(number) 以浮点数的方式返回向上圆整
的结果
数学 math.floor(number) 以浮点数的方式返回向下圆整
的结果
数学 math.sqrt(number) 返回平方根;不能用于负数
数学 pow(x, y[, z]) 返回x的y次方对z求模的结果
数学 round(number[, ndigits]) 四舍五入为指定的精度,正好为
5时舍入到偶数
© Licensed under CC BY-NC-SA 4.0

价值投资不能保证我们盈利, 但价值投资给我们提供了通向成功的唯一机会。——巴菲特

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!