Python 廖雪峰教程《一》
本系列摘抄自:廖雪峰python教程
Python 简介
1. python的优点:代码量少。Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。
2. python的缺点:第一个缺点是执行速度慢,第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。
使用文本编辑器
1. 直接运行.py文件
有同学问,能不能像.exe文件那样直接运行.py
文件呢?在Windows上是不行的,但是,在Mac和Linux上是可以的,方法是在.py
文件的第一行加上一个特殊的注释:
#!/usr/bin/env python3 print(\'hello, world\')
然后,通过命令给hello.py
以执行权限:
$ chmod a+x hello.py
就可以直接运行hello.py
了,比如在Linux下运行:
$ ./hello.py
python基础
如果字符串里面有很多字符都需要转义,就需要加很多\
,为了简化,Python还允许用r\'\'
表示\'\'
内部的字符串默认不转义,可以自己试试:
>>> print(\'\\\t\\\') \ \ >>> print(r\'\\\t\\\') \\\t\\
理解变量在计算机内存中的表示也非常重要。当我们写:
a = \'ABC\'
时,Python解释器干了两件事情:
-
在内存中创建了一个
\'ABC\'
的字符串; -
在内存中创建了一个名为
a
的变量,并把它指向\'ABC\'
。
也可以把一个变量a
赋值给另一个变量b
,这个操作实际上是把变量b
指向变量a
所指向的数据,例如下面的代码:
# -*- coding: utf-8 -*- a = \'ABC\' b = a a = \'XYZ\' print(b)
最后一行打印出变量b
的内容到底是\'ABC\'
呢还是\'XYZ\'
?如果从数学意义上理解,就会错误地得出b
和a
相同,也应该是\'XYZ\'
,但实际上b
的值是\'ABC\'
,让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = \'ABC\'
,解释器创建了字符串\'ABC\'
和变量a
,并把a
指向\'ABC\'
:
执行b = a
,解释器创建了变量b
,并把b
指向a
指向的字符串\'ABC\'
:
执行a = \'XYZ\'
,解释器创建了字符串\’XYZ\’,并把a
的指向改为\'XYZ\'
,但b
并没有更改:
所以,最后打印变量b
的结果自然是\'ABC\'
了。
讲解ASCII、Unicode和UTF-8的关系及由来,具体请点链接查看。
dict
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
要避免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 = {\'Michael\': 95, \'Bob\': 75, \'Tracy\': 85} >>> d.pop(\'Bob\') 75 >>> d {\'Michael\': 95, \'Tracy\': 85}
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,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。
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s = set([1, 1, 2, 2, 3, 3]) >>> s {1, 2, 3} >>> 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}
对于不可变对象,比如str,对str进行操作呢:
>>> a = \'abc\' >>> a.replace(\'a\', \'A\') \'Abc\' >>> a \'abc\'
虽然字符串有个replace()
方法,也确实变出了\'Abc\'
,但变量a
最后仍是\'abc\'
,应该怎么理解呢?
我们先把代码改成下面这样:
>>> a = \'abc\' >>> b = a.replace(\'a\', \'A\') >>> b \'Abc\' >>> a \'abc\'
要始终牢记的是,a
是变量,而\'abc\'
才是字符串对象!有些时候,我们经常说,对象a
的内容是\'abc\'
,但其实是指,a
本身是一个变量,它指向的对象的内容才是\'abc\'
:
┌───┐ ┌───────┐
│ a │─────────────────>│ \'abc\' │
└───┘ └───────┘
当我们调用a.replace(\'a\', \'A\')
时,实际上调用方法replace
是作用在字符串对象\'abc\'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串\'abc\'
的内容。相反,replace
方法创建了一个新字符串\'Abc\'
并返回,如果我们用变量b
指向该新字符串,就容易理解了,变量a
仍指向原有的字符串\'abc\'
,但变量b
却指向新字符串\'Abc\'
了:
┌───┐ ┌───────┐
│ a │─────────────────>│ \'abc\' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ \'Abc\' │
└───┘ └───────┘
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。