补充材料:https://github.com/madscheme/introducing-python
(上面的网址实际上是一个代码交流社区,英语水平足够的同学可以试着利用一下。)
第1章 Python初探
IDLE的启动
安装Python后,我们可以从“开始”菜单→“Python 3.4”→“IDLE(Python 3.4GUI - 64 bit)”来启动IDLE。IDLE启动后的初始语句如下:
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
这个界面就是交互式编译器的界面了。
所谓的交互式解释器,就是Python内置的一个解释代码的东西(解释器嘛),写一行,按一下回车,就会有反应出现(其实有例外)。解释器可以快速的让我们知道这一句代码的作用是什么,十分方便。之后的大部分例子笔者会用交互式解释器里编写(“>>>”这三个连续的右书名号是不需要大家输入的)。
大家可以试试调戏一下解释器,比如输入8*9,看结果是不是72……输出print(47)试试?
第一章没有什么特别的内容,但大家不妨试一下输入:
>>> import this
结果会是这个:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren‘t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you‘re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it‘s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let‘s do more of those!
(或许有一天我会把它放到我的翻译作品里……Python之禅)
如果你想新建一个Python程序的源文件,单击左上角的“File”,再单击“New File”。或者直接按下Ctrl+N。Python有很好的自动缩进功能。其他语言中的缩进大多(pascal,C和C++)只是个人喜好问题,但Python的缩进代表的是程序的区域,代替了其他语言中或复杂或简洁的分隔符。似乎很简便?但和C++的大括号一比,我觉得这不是好事。
第2章 Python基本元素:数字、字符串和变量
2.1 变量、名字和对象
Python的变量类型与C语言很相似,但Python中有一些独特的写法和个性设定。
Python中所有数据,都是以对象(object)的形式存在的。对象就像一个盒子,里面装的是数据。有的数据可以改变,那么这个盒子是开口的,否则就是不开口的。
与c/c++一样,赋值号就是“=”。
>>> a=7
>>> pint(a)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
pint(a)
NameError: name ‘pint‘ is not defined
>>> print(a)
7
上面的代码中,我调用了print()函数,但显然我第一次没有拼写对,于是解释器报错了。报错的信息中包含了错误位置和错误类型。看懂报错信息通常有助于改正错误,但有时(极少)也会出现误导的情况。
使用type()语句,可以让我们知道变量的类型。
>>> a=7
>>> type(a)
<class ‘int‘>
类(class)即类型。
注意
变量名只能包含以下字符:
小写字母(a-z),大写字母(A-Z),数字(0-9),下划线(_)。出现次数没有限制。
变量名不允许用数字作为开头,同时,有一些单词不能作为变量名,他们是Python的保留字。
2.2 数字
Python中的数字包括整数(integer,简写为int)和浮点数(float)。
我们可以对数字进行如下计算:
+、-、*、/(浮点数除法)、//(整除)、%(取余)、**(幂)
2.2.1 整数
任何仅含数字的序列都被认为是整数。但整数不能以0开头。否则:
>>> 05
SyntaxError: invalid token
上面的报错提示我们程序中有一个“非法标识”。
整数的除法会产生一个浮点数(不管能不能除尽):
>>> 10/2
5.0
如果除数为零:
>>> 5/0
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
5/0
ZeroDivisionError: division by zero
之前我们一直在用立即数(直接输入的数字)进行运算,已经赋值的变量当然可以和立即数进行运算:
>>> a=13
>>> a/5
2.6
与C一样,我们对一个变量进行四则运算有两种写法:
>>> a=2
>>> a+=3
>>> a
5
>>> a=a+3
>>> a
8
其他运算如“-”“*”“/”以此类推。
下面的操作可以同时获得商和余数:
>>> divmod(9,5)
(1, 4)
divmod()这个函数的返回值,或者说返回结果是一个元组(tuple)。
2.2.2 优先级
乘除的优先级大于加减。而括号的优先级最高。
2.2.3 基数
Python中整数默认使用十进制,但我们仍然有方法使用其他进制。
0b或0B代表二进制,0o或0O代表八进制,0x或0X代表十六进制。
十进制转其他进制用辗转相除法,其他进制转十进制用按幂展开的方法。
不同进制用在位运算中。
2.2.4 类型转换
可以用int(x)方便的把某个类型的变量转换成其他类型。举一个布尔型变量的例子:
>>> bool(12)
True
布尔型变量只有两个值,true和false。转换成整形时,分别代表1和0。
浮点数转换成整数时,小数点后的部分会被舍去:
>>> int(98.6)
98
自行尝试一下不同类型的变量的加减!
我们还可以把只含有数字和‘-’的字符串转化为对应的数字:
>>> int(‘98‘)
98
>>> float(‘-11.12‘)
-11.12
2.2.5 一个int型有多大
Python 3中int型可以是无穷大。
2.2.6 浮点数(float)
浮点数可以写为数学中的小数形式,也可以写成科学计数法形式:
>>> 1.123e4
11230.0
2.3 字符串
2.3.1 使用引号创建
把字符包在一对单引号或双引号之间都可以创建一个字符串,但Python中默认的字符串保存模式似乎是单引号:
>>> ‘Hello world‘
‘Hello world‘
>>> "Hello world"
‘Hello world‘
还可以用三个连续的单引号或双引号创建字符串。它通常用于创建多行字符串。
>>> ‘‘‘wodetianna
woweishenm
yao da zheme chang‘‘‘
‘wodetianna\nwoweishenm\nyao da zheme chang‘
这里,换行也被记录了下来,没错就是那个“\n”。当然了这里我用的是交互式解释器,如果用print(),效果是不同的。
可以通过base=’’来创建一个空字符串。欣然字符串是可以加减的。
>>> bottles=99
>>> base=‘‘
>>> base+=‘current money: ‘
>>> base+=str(bottles)
>>> base
‘current money: 99‘
str也就是string的缩写,是字符串的类型名。
2.3.2 使用str()进行类型转换
>>> str(98.6)
‘98.6‘
如上所述,再举个有趣的例子:
>>> str(1.0e4)
‘10000.0‘
2.3.3 转义
\n是换行符,\t是制表符(Tab),\’和\”表示单、双引号,而\\代表你需要输出一个反斜线字符。
2.3.4 字符串使用
可以用“+”将字符串拼接起来:
>>> a=‘hello ‘
>>> b=‘thank you‘
>>> a+b
‘hello thank you‘
“*”可以用来复制字符串:
>>> start=‘Hi‘ *4
>>> start
‘HiHiHiHi‘
使用[]提取字符:
>>> letters=‘abcdefghijklmn‘
>>> letters[0]
‘a‘
>>> letters[-1]
‘n‘
>>> letters[100]
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
letters[100]
IndexError: string index out of range
有趣的是[]中的数字可以是负数,但负数的绝对值也不能超过数组中元素个数。
使用[start:end:step]分片
如果省略start,默认从0开始;省略end的话会提取到结尾。
>>> le=‘abcdefghijklmnopqrstuvwxyz‘
[:]提取从开头到结尾的整个字符串
>>> le[:]
‘abcdefghijklmnopqrstuvwxyz‘
[start:]从start提取到结尾
>>> le[20]
‘u‘
>>> le[20:]
‘uvwxyz‘
>>> le[-3:]//这个操作让我们得以提取最后三个字符
‘xyz‘
[:end]从开头提取到end-1
>>> le[:26]
‘abcdefghijklmnopqrstuvwxyz‘
>>> le[26]
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
le[26]
IndexError: string index out of range
[start:end]从start提取到end-1
>>> le[18:24]
‘stuvwx‘
>>> le[18:-3]
‘stuvw‘
>>> le[-10:13]
‘‘
>>> le[-10:-3]
‘qrstuvw‘
[start:end:step]从start提取到end-1,每step个字符提取一个
>>> le[::7]
‘ahov‘
>>> le[:19:3]
‘adgjmps‘
那么问题来了,步长可以为负数吗?还真行:
>>> le[-1::-1]
‘zyxwvutsrqponmlkjihgfedcba‘
另一个让人欣喜的消息是,分片操作对于无效偏移量的容忍程度远大于单字符提取操作。在分片中,小于起始位置的偏移量会被当作0,大于终止为止的则会被当作-1:
>>> le[-50:]
‘abcdefghijklmnopqrstuvwxyz‘
>>> le[-100:-111]
‘‘
>>> le[:70]
‘abcdefghijklmnopqrstuvwxyz‘
常用字符串函数:
使用len()可以获得长度:
>>> len(le)
26
使用split()分割:
这里我们遇到了非广义函数。split只适用于字符串类型。我们需要输入字符串的名称,一个点号,接着是需要调用的函数名,以及需要传入的参数。
使用内置的字符串函数可以按照分隔符将字符串分割成若干子串构成的列表:
>>> lists=‘1,2,3,4,5,6‘
>>> lists.split(‘,‘)
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘]
传入的参数为‘,’,而如果不传入参数,那么会默认按照空白字符——换行符、空格、制表符来分割:
>>> ll=‘hello world i am using python‘
>>> ll.split()
[‘hello‘, ‘world‘, ‘i‘, ‘am‘, ‘using‘, ‘python‘]
使用join()合并:
join()函数的用法和split()相反:string.join(list)
>>> to_list=[‘1‘,‘2‘,‘3‘,‘4‘]
>>> to_string=‘,‘.join(to_list)
>>> print(to_string)
1,2,3,4
>>> to2_string=‘...‘.join(to_list)
>>> print(to2_string)
1...2...3...4
类似split用法函数还有(同时写出参数的类型):
string.startswith(string2) string.enswith(string2)
string.find(string2) 返回值为string2的第一次出现的位置
string.rfind(string2) 返回值为string2的最后一次出现的位置
string.count(string2) 返回值为string2在string中出现的次数
大小写与对齐方式(一些不常用的字符串函数):
string.strip(string2):删除string最后的string2:
>>> setup.strip(‘?‘)
‘what did i done‘
>>> setup.strip(‘done‘)
‘what did i done?‘
>>> setup.strip("done?")
‘what did i ‘
string.capitalize():让字符串首字母变成大写
string.title():让所有单词的开头字母变成大写
string.upper():让所有字母都变成大写
string.lower():让所有字母变成小写。
string.swapcase():让所有字母大小写转换
string.center(30):在30个字符的宽度内居中
string.ljust(30):左对齐
string.rjust(30):右对齐
string.replace(s1,s2,n):将string中的前n处s1替换为s2,如果省略n,则将替换全部s1。