Python基础内容
版本:Python3平台:Windows 7/10
Python简介
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
Pyhton是一种牺牲硬件换取软件的编程语言,同样的一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。
但是,代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要10秒。
Python语言的定位:“优雅”、“明确”、“简单”。所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。
- Python适合的领域:服务器后台 服务器脚本工具 Web应用程序
- Python不适合的领域:操作系统 移动端应用 3D游戏
Python的缺点:
1.运行速度慢:因为Python属于解释型语言,代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。
2.代码不能加密:如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。
安装Python
目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,我们的教程将以最新的Python 3.5版本为基础。请确保你的电脑上安装的Python版本是最新的3.5.x,这样,你才能无痛学习这个教程。
下载地址:https://www.python.org/downloads/
基本的输入与输出
输出
用print()
在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world'
,用代码实现如下:
print('hello, world')
print()
函数也可以接受多个字符串,用逗号“,”
隔开,就可以连成一串输出:
print('The quick brown fox', 'jumps over', 'the lazy dog')
print()
会依次打印每个字符串,遇到逗号“,”
会输出一个空格,因此,输出的字符串是这样拼起来的:
print()
也可以打印整数,或者计算结果:
print('100 + 200 =', 100 + 200)
输入
Python提供了一个input()
,可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:
name = input('please enter your name: )
数据类型与变量
整数:Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:
1
,100
,-8080
,0
,等等。计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x
前缀和0-9
,a-f
表示,例如:0xff00
,0xa5b4c3d2
,等等。浮点数:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,
1.23x109
和12.3x108
是完全相等的。浮点数可以用数学写法,如1.23
,3.14
,-9.01
,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10
用e
替代,1.23x109
就是1.23e9
,或者12.3e8
,0.000012
可以写成1.2e-5
,等等。字符串:字符串是以单引号’或双引号”括起来的任意文本,比如
'abc'
,"xyz"
等等。请注意,''
或""
本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'
只有a
,b
,c
这3个字符。如果'
本身也是一个字符,那就可以用""
括起来,比如"I'm OK"
包含的字符是I
,'
,m
,空格,O
,K
这6个字符。如果字符串内部既包含
'
又包含"
怎么办?可以用转义字符\
来标识,比如:'I\'m \"OK\"!'
转义字符
\
可以转义很多字符,比如\n
表示换行,\t
表示制表符,字符\
本身也要转义,所以\\
表示的字符就是\
print('I\'m learning\nPython.') print('\\\n\\')
如果字符串里面有很多字符都需要转义,就需要加很多k,为了简化,Python还允许用
r''
表示''
内部的字符串默认不转义:print(r'\\\t\\')
布尔值:布尔值和布尔代数的表示完全一致,一个布尔值只有
True
、False
两种值,要么是True
,要么是False
,在Python中,可以直接用True
、False
表示布尔值(请注意大小写),也可以通过布尔运算计算出来:>>> True True >>> False False >>> 3 > 2 True >>> 3 > 5 False
布尔值可以用
and
、or
和not
运算。空值:空值是Python里一个特殊的值,用
None
表示。None不
能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型变量:变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头。Python为动态语言,所以变量的类型不固定。
最后,理解变量在计算机内存中的表示也非常重要
a = 'ABC'
Python解释器干了两件事情:
1.在内存中创建了一个
'ABC'
的字符串;2.在内存中创建了一个名为
a
的变量,并把它指向'ABC'
。解释运行结果:
a = 'ABC' b = a a = 'XYZ' print(b)
关于除法的一些问题
10/3->3.3333333
,10//3->3
,9/3->3.0
也就是说除法
/
是精确运算,地板除//
结果永远是整数
list与tuple
list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
classmates = ['Michael', 'Bob', 'Tracy']
用len()
函数可以获得list元素的个数:
>>> len(classmates)
3
用索引来访问list中每一个位置的元素,记得索引是从0
开始的:
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素:
>>> classmates[-1]
'Tracy'
以此类推,可以获取倒数第2个、倒数第3个:
>>> classmates[-2]
'Bob'
>>> classmates[-3]
'Michael'
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
classmates.append('Adam')
也可以把元素插入到指定的位置,比如索引号为1
的位置:
classmates.insert(1, 'Jack')
要删除list末尾的元素,用pop()
方法:
classmates.pop()
要删除指定位置的元素,用pop(i)
方法,其中i
是索引位置:
classmates.pop(1)
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
classmates[1] = 'Sarah'
list里面的元素的数据类型也可以不同,比如:
L = ['Apple', 123, True]
list元素也可以是另一个list,比如:
s = ['python', 'java', ['asp', 'php'], 'scheme']
如果一个list中一个元素也没有,就是一个空的list,它的长度为0
:
>>> L = []
>>> len(L)
0
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
classmates = ('Michael', 'Bob', 'Tracy')
注意:
t = (1)
的定义等价于t = 1
为了消除歧义只有1个元素的tuple定义时必须加一个逗号,
t = (1,)
解释运行结果:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
条件判断
计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。
age = 20
if age >= 18:
print('your age is', age)
print('adult')
根据Python的缩进规则,如果if
语句判断是True
,就把缩进的两行print
语句执行了,否则,什么也不做。
也可以给if
添加一个else
语句,意思是,如果if
判断是False
,不要执行if
的内容,去把else
执行了:
age = 3
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager')
注意不要少写了冒号
:
。
当然上面的判断是很粗略的,完全可以用elif
做更细致的判断:
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
elif
是else if
的缩写,完全可以有多个elif
,所以if
语句的完整形式就是:
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
if
判断条件还可以简写,比如写:
if x:
print('True')
只要x
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。
解释运行结果:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
循环
for in 循环
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
所以for x in ...
循环就是把每个元素代入变量x
,然后执行缩进块的语句。
再比如我们想计算1-10的整数之和,可以用一个sum
变量做累加:
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum)
如果要计算1-100的整数之和,从1
写到100
有点困难,幸好Python提供一个range()
函数,可以生成一个整数序列,再通过list()
函数可以转换为list。比如range(5)
生成的序列是从0
开始小于5
的整数:
>>> list(range(5))
[0, 1, 2, 3, 4]
range(101)
就可以生成0-100的整数序列,计算如下:
sum = 0
for x in range(101):
sum = sum + x
print(sum)
while循环
只要条件满足,就不断循环,条件不满足时退出循环
计算100以内所有奇数之和:
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
在循环内部变量n
不断自减,直到变为-1
时,不再满足while
条件,循环退出。
dict与set
dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value
)存储,具有极快的查找速度(hash表)。这种key-value存储方式,在放进去的时候,必须根据key
算出value
的存放位置,这样,取的时候才能根据key
直接拿到value
。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
把数据放入dict的方法,除了初始化时指定外,还可以通过key
放入:
>>> d['Adam'] = 67
>>> d['Adam']
67
由于一个key
只能对应一个value
,所以,多次对一个key
放入value
,后面的值会把前面的值冲掉:
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
如果key
不存在,dict就会报错:
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'
要避免key
不存在的错误,有两种办法,一是通过in
判断key
是否存在:
>>> 'Thomas' in d
False
二是通过dict提供的get
方法,如果key
不存在,可以返回None
,或者自己指定的value
:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
要删除一个key
,用pop(key)
方法,对应的value
也会从dict中删除:
d.pop('Bob')
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
1.查找和插入的速度极快,不会随着key的增加而变慢;
2.需要占用大量的内存,内存浪费多。
而list相反:
1.查找和插入的时间随着元素的增加而增加;
2.占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
。
要创建一个set
,需要提供一个list作为输入集合:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意,传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1
,2
,3
这3个元素,显示的顺序也不表示set是有序的。
重复元素在set中自动被过滤:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通过remove(key)
方法可以删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
不可变对象
str
是不变对象,而list
是可变对象。
对于可变对象,比如list
,对list
进行操作,list
内部的内容是会变化的,比如:
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
而对于不可变对象,比如str
,对str
进行操作呢:
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'
虽然字符串有个
replace()
方法,也确实变出了'Abc'
,但变量a
最后仍是'abc'
,应该怎么理解呢?
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。