Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

第一章,python的基础

bsky78 edited this page Dec 5, 2016 · 1 revision

目录


前言

Python用来编写应用程序的高级编程语言

Python有完善的内置库和丰富的第三方库

许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python

Python适合开发网络应用,包括网站、后台服务等等,其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;

Python的缺点

  • 运行速度慢,因为Python是解释型语言,代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时
  • 代码不能加密,要发布你的Python程序,实际上就是发布源代码

第一个程序

print(100+200) 得到结果 300
print('hello world.') 打印 hello world.
print("hello world.") 打印 hello world.
输入参数
age = input()
name = input('请输入姓名:')
print('hello',name) # 逗号当做空格输出

缩进

  • 程序以缩进来表示代码块
  • 缩进一般规定用4个空格
  • Python对大小写敏感

整数

正整数和负整数:1 0 300 982 -2 -451

由于使用二进制,所以,有时候用十六进制表示整数比较方便
十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等

浮点数

浮点数也就是小数

之所以将小数称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x10912.3x108 是完全相等的。

字符串

字符串是以单引号'或双引号"括起来的任意文本

如果字符串内部既包含 ' 又包含 " 怎么办?可以用转义字符 \ 来标识,比如:

'I\'m \"OK\"!'
# 显示: I'm "OK"!

简化,Python允许用 r'' 表示''内部的字符串默认不转义

print('\\\t\\')
# \ \
print(r'\\\t\\')
# \\\t\\

如果字符串内部有很多换行,用 \n 写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容:

>>> print('''line1
... line2
... line3''')
line1
line2
line3

布尔值

布尔值只有True、False两种值(注意大小写)
布尔值可以用and、or和not运算

空值

空值是Python里一个特殊的值,用None表示,不能使用 0 来表示空值

变量

变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头
在Python中,等号=是赋值语句,同一变量可以反复赋值,而且可以是不同类型的变量

a = 123 # a是整数
print(a)
a = 'ABC' # a变为字符串
print(a)

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言,静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。

变量在内存中的作用

如: a = 'ABC'
Python解释器干了两件事情:

  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'。

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据

常量

常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量
PI = 3.14159265359

但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,用大写表示常量只是一个习惯上的用法

整数的除法为什么也是精确的

在Python中,有两种除法

  • 第一种
>>> 10 / 3
3.3333333333333335
>>> 9 / 3
3.0
  • 第二种
>>> 10 // 3
3
  • 取余
>>> 10 % 3
1

字符编码

字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte).
1bit = 8byte
所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

字母 A 用ASCII编码是十进制的 65 ,二进制的 01000001 ;

字符 0 用ASCII编码是十进制的 48 ,二进制的 00110000 ,注意字符 '0' 和整数 0 是不同的;

汉字 已经超出了ASCII编码的范围,用Unicode编码是十进制的 20013 ,二进制的 01001110 00101101

你可以猜测,如果把ASCII编码的 A 用Unicode编码,只需要在前面补 0 就可以,因此,A 的Unicode编码是 00000000 01000001

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为"可变长编码"的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

所以你看到很多网页的源码上会有类似的信息,表示该网页正是用的UTF-8编码。

在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言

单个字符的编码,Python提供了 ord() 函数获取字符的整数表示,chr() 函数把编码转换为对应的字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

如果知道字符的整数编码,还可以用十六进制写str:

>>> '\u4e2d\u6587'
'中文'

由于Python的字符串类型是 str,在内存中以Unicode表示,一个字符对应若干个字节。
如果要在网络上传输,或者保存到磁盘上,就需要把 str 变为以字节为单位的 bytes

x = b'ABC'

区分 'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但 bytes 的每个字符都只占用一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.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)

纯英文的 str 可以用 ASCII 编码为 bytes,内容是一样的,含有中文的 str 可以用 UTF-8 编码为 bytes 。含有中文的 str 无法用 ASCII 编码,因为中文编码的范围超过了 ASCII 编码的范围,Python会报错。

bytes 中,无法显示为 ASCII 字符的字节,用 \x## 显示。

从网络接受来的 bytes 需要解码,使用 decode() 函数

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

要计算 str 包含多少个字符,可以用 len() 函数:

>>> len('ABC')
3
>>> len('中文')
2

如果换成计算bytes,len()函数就计算字节数:

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节

由于Python源代码也是一个文本文件,所以,当源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码

格式化

如何输出格式化的字符串?

我们经常会输出类似
'亲爱的xxx你好!你xx月的话费是xx,余额是xx'
之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。

在Python中,采用的格式化方式和C语言是一致的,用 % 实现,举例如下:

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have 1000000ドル.'

% 运算符就是用来格式化字符串的。在字符串内部,%s 表示用字符串替换,%d 表示用整数替换,有几个 %? 占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个 %?,括号可以省略。

常见的占位符有:

符号 说明
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

AltStyle によって変換されたページ (->オリジナル) /