前言
最近开始想学Python,于是上网找到了廖雪峰大神的Python教程:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000
这个教程里面用的是Python 2.x,而现在用的比较多的已经是Python 3.x了。虽然2.x比较稳定并且有很多第三方库,但是2.x已经停止发布新版本。因此显然3.x的前途比较光明。
因此,这个笔记主要是用来记录一些对教程的心得,补充,以及因为版本差别而导致的代码区别。
Python入门与基础
安装
安装没什么问题,去官网https://www.python.org/downloads/下载最新的版本(我这里用的是3.4.3),windows下是一个msi安装程序,已经包办了一切。记着在安装的时候勾上将phython.exe添加到环境变量中。
第一个Python程序
安装完成之后,打开命令行,输入python,回车。这时就直接进入了交互式Python。
输入第一段代码:
print('hello world, python!') #python3写法
在python2中,print是一个语句,不需要括号就可以使用。python3则是去掉了这个语句,将其改为了相同作用的函数。
print 'hello world, python!' #python2写法
结果:
>>>print(‘hello world, python!’)
hello world, python!
这个print和字符串中间有没有空格都是无所谓的,括号和字符串中间有没有空格也无所谓。
教程中推荐了两个代码编辑器,一个是sublime text,另一个是notepad++。我个人比较推荐sublime text,因为这个编辑器真是太风骚,太好用了。唯一美中不足的是sublime text 3收费。sublime text 2可以免费使用,只是会弹出提示框,倒也无妨。而且功能和外观上和2也什么区别,值得推荐。notepad++这个东西好在其自带一个插件,可以将代码带高亮以HTML或者RTF形式导出,在用word写东西时候很好用。
除了在命令行以交互形式写python外,作为一个脚本语言,当然可以写成一个文件然后来解释执行。只要保存成.py形式的文件,在命令行中用python xx.py
就可以解释执行python文件。
在linux中可以使用直接执行.py文件。方法是先在.py文件第一行加上
#!/usr/bin/env python
然后通过命令:
$ chmod a+x xx.py
就可以直接运行.py文件了
在Windows中可以将.py用python.exe打开,也可以做到双击直接运行。
输入输出
输出:
print函数可以向屏幕打印字符串,刚才也用过了。除此之外,括号里满也可以写多个字符串,通过逗号“,”来连接:
print ('hello world', 'my name', 'is', 'python')
其结果是:
hello world my name is python
相当于,用空格将各字符串连接了起来。
print也可以直接打印数字
print (100) # 输出结果:100
print (100+200) # 输出结果:300
print ('100 + 200 =', 100 + 200) # 输出结果:100 + 200 = 300
用引号括起来的就是字符串,会原封不动地打印出来,而数字则会进行运算。
输入
有了输出,输入肯定必不可少。python3中是input(),python2是raw_input()。
name = input() # python3
name = raw_input() # python2
这里这个input()
的用法和C中的gets()
、C#中的Console.ReadLine()
是类似的。
不过input()这个函数里面参数可以写东西:
name = input('Please input your name')
运行会发现在输出前会先输出一句话,这句话就是刚才input()中的字符串。
最后以一个小程序结束本节,这也是教程中的例子。
name = input('Please input your name: ')
print ('hello', name)
结果:
F:\魏睿\Practice\Python\learning>python a.py
Please input your name: weirui
hello weirui
基础
# print absolute value of an integer:
a = 100
if a >= 0:
print a
else:
print -a
#是行注释,形同C中的\\
- Python中没有块注释。
- Python中缩进是语法的一部分,如果没有缩进,会报错:
IndentationError: expected an indented block
数据类型和变量
Python也是一种弱类型语言,声明变量可以不声明变量类型。
整数,小数的写法和C语言没什么区别。
字符串
字符串用双引号"
或者单引号'
来括起来。如果字符串中有单引号'
,可以用双引号来将字符串括起来。比如:"I'm wr"
。如果又有单引号又有双引号,那就用\
来转义:'I\'m \"OK\"'
,表示的字符串就是:I'm "OK"
。
如果有好多转义的话,可以用r''
来表示。
print(r'\\\\') # 输出结果为:\\\\
print('\\\\') # 输出结果为:\\
如果字符串内部有很多换行,如果不想用\n
来换行的话,可以使用'''...'''
的形式表示多行内容。
比如:
print('''line1
line2
line3''')
结果就是
>>> print(”’line1
line2
line3
”’)
line1
line2
line3
>>>
布尔值
真是True,假是False,注意大小写。
可以进行的运算是and
、or
、not
。
变量
教程中讲的很详细,除了弱类型以外,基本上和C没什么区别。
字符串和编码
Python3中默认编码是Unicode,所以可以放心大胆地写中文字符串。形如
a = '今天天气好'
print('天气好啊')
print(a)
等代码都可以没有任何问题打印出中文。
在Python2种则需要使用u'xxx'
的形式来打印字符串。
Python中的格式化字符串用法和C中的printf类似,但不同的是格式化字符串并不需要print的参与,可以随时随地格式化。下面是一个例子:
'Hello %s' % 'weirui' # 结果:'Hello weirui'
'%d + %d = %d' % (1, 2, 3) # 结果:'1 + 2 = 3'
'%02d:%02d:%02d' % (12, 5, 2) # 也支持占位符,结果:'12:05:02'
要是要输出%,用%%
来转义。
条件语句
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
有几个注意的地方:
- 冒号不能省略
- 缩进不能省略
- 条件语句可以不加括号
其他地方就和C之类的编程语言没什么区别了。
数组和循环语句
Python中的数组有list和tuple两种。它俩最大的区别就是前者初始化后可变,后者初始化后元素不可变。相当于变量和常量的区别。
初始化:
a = [1, 2, 3, 4] # list初始化方式
a = (1, 2, 3, 4) # tuple初始化方式
用方括号就是初始化了list,用圆括号就是初始化了tuple。在交互式中用type()函数可以查看结果:
>>> a = [1, 2]
>>> type(a)
class ‘list’
>>> a = (1, 2)
>>> type(a)
class ‘tuple’
list和tuple中的元素可以是不同类型:
a = [1, '1', '123']
也可以进行数组的嵌套:
a = [1, 2, 3]
b = [a, 4, 5, 6] # 相当于 b = [[1, 2, 3], 4, 5, 6]
可以用len()函数来获取数组长度:
a = [1,2,3,4]
len(a) # 结果:4
也支持随机存取
people = ['张三', '李四', '王五']
people[0] # 结果:'张三'
people[1] # 结果:'李四'
如果越界则会提示错误:
people[3]
# 结果:
# Traceback (most recent call last):
# File "<pyshell#31>", line 1, in <module>
# people[3]
# IndexError: list index out of range
但是python中一个比较有意思的地方是,若尝试people[-1]
会发现并没有错误,而是会返回最后一个元素。
people[-1] # 结果:'王五'
以此类推,可以一直访问到第一个元素为止:
people[-2] # 结果:'李四'
people[-3] # 结果:'张三'
people[-4] # 结果:报错越界
使用append(element)
方法可以向list末尾添加元素:
people.append('赵六')
# people = ['张三', '李四', '王五', '赵六']
使用insert(i,element)
来插入元素:
people.insert(1, '李白')
# people = ['张三', '李白', '李四', '王五', '赵六']
删除末尾元素用pop()
,删除指定位置元素用pop(i)
:
people.pop() # 结果:people = ['张三', '李白', '李四', '王五']
people.pop(1) # 结果:people = ['张三', '李四', '王五']
需要注意的是,tuple是没有上面的append()
、insert()
、pop()
等方法的,并且也不能修改数组中的值。
Python中的循环有两种,一种是for循环,另一种是while循环。
for循环的用法:(还用刚才最后执行完pop(1)
的list people来示例)
for person in people:
print (person)
结果是:
张三
李四
王五
同if语句一样,冒号不能丢了。
这样的for循环语句在C#和Java中也都存在,用来遍历数组非常好用。
而如果想实现传统的递增循环,可以借助一个range()
函数来实现。range(n)
函数会产生一个整数序列,其顺序是0~n-1。range(0)
并不会报错,只会产生一个空序列。借助这个函数,就可以写出for (int i = 0; i < 10; i++)
这种循环了:
for x in range(5):
print (x)
# 结果:
# 0
# 1
# 2
# 3
# 4
while循环的用法也没什么特殊的,和c语言差不多:
x = 0
while x < 5:
print (x)
x = x + 1
结果和上面的for循环相同。
另外需要注意的一点是,和其他大多数编程语言不一样的是,python中并不需要括号来标示代码块,取而代之的是强制的缩进格式。上面的while循环虽然没有括号,但是其循环体内有两行代码,这是因为print(x)
和x = x + 1
是相同的缩进,所以它们处于相同的代码块中。若下一行代码没有缩进,则下一行代码就不是while循环中的代码,while循环的时候就不会执行它。
字典和集合,dict和set
字典dict就是哈希表。使用键值对(key-value)来存取数据。用法很简单:
初始化:(注意是用大括号)
age = {'张三':21, '李四':35, '王五':43}
根据key访问value
age['张三'] # 结果:21
如果key不存在,则会报错:
age['赵六']
# 结果:
# Traceback (most recent call last):
# File "<pyshell#75>", line 1, in <module>
# age['赵六']
# KeyError: '赵六'
可以通过in
语句,或者get()
方法来检测key是否存在:
'赵六' in age # 结果:False
age.get('赵六') # 结果:返回一个None,但是在交互式中没有显示
age.get('赵六', -1) # 后面这个参数是当key不存在时返回的value,因此结果是-1
要删除某个键值对,可以用pop()
方法:
age.pop('张三') # 函数返回'张三'的value 21,然后age = {'李四': 35, '王五': 43}
另外也可以直接通过key获取value然后修改value
age['李四'] = 12 # 结果age = {'李四': 12, '王五': 43}
集合set和dict不同的是,set只保存key而不保存value,并且set中不允许有重复的值出现。
set的初始化,需要一个list来作为输入集合:
a = set([1,2,3,4]) # 结果:a = {1, 2, 3, 4}
若输入重复的值,在初始化的时候就会自动过滤掉:
a = set([1,1,2,3,4,4]) # 结果:a = {1, 2, 3, 4}
可以通过add()和remve()来添加删除元素。
a.add(5) # 结果:a = {1, 2, 3, 4, 5}
a.remove(5) # 结果:a = {1, 2, 3, 4}
关于dict和set还有一点是,这两者都只能放入不可变对象。因为要进行hash操作,如果放入可变对象,那么hash值就不对了。比如这两个都不能放入list,因为list是一个可变对象。
入门与基础部分的笔记就到此结束了,这刚好对应教程中的第一个Python程序
和Python基础
两节。
下一次的笔记将主要包括python中的函数调用,以及一些python中的高级特性诸如切片,迭代方法。
这一节就到此结束,希望对大家,对我都有所帮助。:P