我为何要学python呢……大约是因为兴趣,还有就是它简单(对,它相对来说比较简单)。为何会产生如此奇怪的兴趣呢……大约是因为觉得好玩吧。以前的时候觉得哇塞爬虫好酷,看到别人写网站好酷好酷,要是我会写就好了呢;后来上了大学学数学要学一些编程课,一开始学C语言:我擦这是什么玩意!从此扑街了很久。后来忽然又觉得好玩就开始打算看一下python,正打算从爬虫开始起步,正巧又遇到了个机会可以帮忙让这个兴趣可以做点贡献有点用处,于是就这样愉快的开始玩耍了。现在自己真的写起来发现……懂得太少实在难办,毕竟我是一个只学过C啊C++和matlab的渣渣。。。什么HTML啊http啊css啊编码啊前端后端web都不懂,也不太懂网页是怎么建的,也看不懂结构什么的,也不懂数据库,不知道要怎么连接数据库。

放假了有时间了终于可以玩啦,于是一个一个慢慢来玩吧。感觉这些东西主要是量比较大,需要了解的比较多,但是学起来或许并不是难度很大。但是一堆完全不懂的东西一下子全摆在这里也是很头疼啊。

这个教程适合什么都不懂的小白来看,简单明了,总结的都是精华。还总结了遇到的bug,天啦这么良心的作者,我真想给她打钱【王婆脸】
写博客是最好的学习方式。

以sublime text2为编辑器,代码都是python2。为何学2呢,因为据说2的库比较全……。python3好像对编码进行了一些调整,一些print之类的语句也变了,不过无所谓,编程主要学的是思想,这些都是次要的。

当然也可以选用cmd直接运行,讲真cmd其实还……挺丑的,也不是彩色的,功能也少一些,写起来麻烦,而且我的cmd显示中文特别的有问题,百度方法都试了依旧会时不时的出现乱码。sublime功能多,对新手来说学习成本高一点,但是会用了之后可以省很多事情。而且缩进呀什么的也挺好用的。python缩进其实真的挺严格的。

配置环境变量,安装插件什么的都是很久之前的事情了,具体不记得了……按照百度一步步一步步一步步一步步来就好(这里想吐槽一万句)。


1
print 'hello word'

bug1:运行一定要先把文件保存成.py格式,要不然会出现找不到main函数的错误

ctrl+B运行程序,哇成功第一步

哇
哎用新浪微博做图床出现水印就这样吧我也是懒懒的。

Python提供了一个raw_input(),可以让用户输入字符串,并存放到一个变量里。但其实这个函数很有局限。

range()函数,可以生成一个整数序列,比如range(6)生成的序列是从0开始小于6的整数:0 1 2 3 4 5
range(1, 11)生成[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。


####字符串
''``""括起来的。必要时需要用到转义字符\。例如I’m OK应该写成'I\'m OK'\n是换行,多个换行用...实现。

1
2
3
print '''line1
... line2
... line3'''

python的语法特别灵活,学习C语言之类时候是不是被各种int啊之类的数据类型搞晕了呢?在python里面不用担心这个,完全可以灵活赋值。

1
2
3
4
a = 123 # a是整数
print a
a = 'ABC' # a变为字符串
print a

这个时候我们预计得到的正确结果,运行一下,当当当当!!!
出现了奇怪的错误这是不是逗我


#####编码问题
下面我们来分析下,恩原来是出现了汉字,蛋疼的编码问题,哪怕把格式转换成UTF-8编码为什么还是出现错误呢。

于是添加# -*- coding: UTF-8 -*-
正确了

bug2 出现编码错误。【程序中尽量不要使用中文,文件名也尽量不要用中文,这种类似bug总是出现。# -*- coding: UTF-8 -*-这行代码是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

现象:最近需要抓取一些网页的信息,但发现Python的乱码问题相对Java来说,不太一样。按照以往Java解决中文乱码问题的思路去解决Python乱码,貌似行不通,报错信息:

SyntaxError: Non-ASCII character ‘\xe5’ in file

原因:Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他的语言,比如小日本的日语……),此时即使你把自己编写的Python源文件以UTF-8格式保存了;但实际上,这依然是不行的。

解决方法:在源码的第一行添加以下语句:

# -*- coding: UTF-8 -*- 或者#coding=utf-8

(注:此语句一定要添加在源代码的第一行)

这个问题很头疼啊……这种bug我已经遇到一万遍了,每次都很头疼,很多现在也无法解决。


####list和tuple

classmates = ['Michael', 'Bob', 'Tracy']

用len()函数可以获得list元素的个数:len(classmates)

最后一个元素的索引是- 1。classmates[-1]:Tracy

可以往list中追加元素到末尾:classmates.append('Adam'): [‘Michael’, ‘Bob’, ‘Tracy’, ‘Adam’]

也可以把元素插入到指定的位置,比如索引号为1的位置:classmates.insert(1, 'Jack'):[‘Michael’, ‘Jack’, ‘Bob’, ‘Tracy’, ‘Adam’]

用pop()方法删除元素。pop()是删除最后一个元素。pop(i)是删除第i个元素。

列表里面元素可以不同,也可以包含列表,比如:

1
2
p = ['huge', 'yuanhong']
s = ['KKW', 'huojianhua', p, 'jindong']

有序列表叫元组:tuple,tuple里面的元素不可以修改。

1
classmates = ('Michael', 'Bob', 'Tracy')

注意,只有1个元素的tuple定义时必须加一个逗号,t = (1,)来防止歧义。


####字典

python里有字典,key-value的数据结构经常会有很大用处。语句:d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
注意是大括号。

总结:list是[],字典是{},tuple是()。

把数据放入dict,可直接通过key放入:d['Adam'] = 67

要删除一个key,用pop(key)方法,对应的value也会从dict中删除d.pop('Bob')


####IF语句

if语句

1
2
3
4
5
a = 100
if a >= 0:
print a
else:
print -a

缩进一般是4个空格,别问为什么,因为大家都是四个。如果if语句判断是True,则执行就把缩进的两行print语句。

使用elif来实现elseif功能。

举个形象的例子。

1
2
3
4
5
6
7
8
if 胡歌比KKW帅:
喜欢他
elif 胡歌比靳东帅:
娶他
elif 胡歌比霍建华帅:
立刻娶他
else:
请你去看眼科谢谢

运行结果:

喜欢他

注意冒号

if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else。

注意!!!!

这样就会出现一些问题,比如我们不确定胡歌到底有多帅的时候,用这种逻辑写循环,就会造成只有第一步的判断运行过去了,也就是说胡歌仅仅是和KKW比较了帅气程度,直接得出了结果,然后程序结束;胡歌还没有运行到第三步即和霍建华比较判断,程序就已经结束了。这根本不科学,不符合实际情况。
所以上面程序结果运行出来是喜欢他,而不是我想要的正确结果立刻娶他这点在写程序中需要特别注意,容易出错。

####For循环

for x in …循环就是把每个元素代入变量x,然后执行缩进块的语句。

1
2
3
names = ['huge', 'KKW', 'huojianhua']
for name in names:
print name

运行结果是:

huge
KKW
huojianhua

也可以对字典进行迭代:

1
2
3
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print key

运行结果是:

a
c
b

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues()

1
2
3
4
d = {'a': 1, 'b': 2, 'c': 3}
for i in d.itervalues():
print i

运行结果是:

1
3    
2

如果要同时迭代key和value,可以用for k, v in d.iteritems()

python里的循环和matlab或者C等等语言的循环略有不同,python更加方便。但是如果想实现C中利用下标循环的效果,可以使用enumerate函数。enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

1
2
for i, key in enumerate(['A', 'B', 'C']):
print i, key

0 A
1 B
2 C

####While循环
while循环,只要条件满足,就不断循环,条件不满足时退出循环。这个和其它差不多。

1
2
3
4
5
6
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print sum


####函数

定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

1
2
3
4
5
def my_abs(x):
if x >= 0:
return x
else:
return -x

如果想定义一个什么事也不做的空函数,可以用pass语句来占位置。

1
2
def shayebugan():
pass

函数可以同时返回多个值,但其实就是一个tuple。在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。


####切片

这个功能用于简化循环。
比如0~99这100个数字,L = range(100),取前5个,写作L[:5],得到0 1 2 3 4 。
tuple也可以切片,唯一区别是tuple不可变。因此,操作的结果仍是tuple。
或者可以直接简写(0, 1, 2, 3, 4, 5)[:3],结果也是0 1 2


####列表生成式
如果要生成[1x1, 2x2, 3x3, …, 10x10],一个方法是写个循环,这样做有点麻烦。

1
2
3
4
L = []
for x in range(1,11):
L.append(x*x)
print L

运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

另外我们可以用列表生成式来做:[x * x for x in range(1, 11)]

1
2
3
L = []
L = [x * x for x in range(1, 11)]
print L

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

得到相同结果。

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

python很多东西都可以通过一行算法实现,很简洁。比如
[x * x for x in range(1, 11) if x % 2 == 0]筛选出仅偶数的平方[4, 16, 36, 64, 100].

[m + n for m in 'ABC' for n in 'XYZ']使用两层循环,可以生成全排列[‘AX’, ‘AY’, ‘AZ’, ‘BX’, ‘BY’, ‘BZ’, ‘CX’, ‘CY’, ‘CZ’]。


####生成器
生成器(Generator)一边循环一边计算,可以省去大量被浪费的空间。比如可以用列表生成器来创建generator。g = (x * x for x in range(10)),运行得到结果 at 0x02609918>。可以调用next()来逐个输出g的值。generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。generator也是可以进行迭代的对象,于是可以直接用for来做。

1
2
for n in g:
print n

运行结果:

1
4
9
16
25
36
49
64
81

廖雪峰博客给出了一个生成菲波那切数列的例子,不得不说,python比C语言的实现要简单多啦。(题外话,那天偶然看见知乎上说什么去投行还是哪里的工作面试中出过这个题,让用一种语言来实现,我也是惊呆了……为何经济金融类的岗位要考这种基础算法题= =)

用函数方法:

1
2
3
4
5
6
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print b
a, b = b, a + b
n = n + 1

用generator方法:

要把fib函数变成generator,只需要把print b改为yield b就可以了.如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。

1
2
3
4
5
6
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1

注意:函数是每次顺序执行,遇到return返回

而generator,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

1
2
3
4
5
6
7
8
9
10
11
12
def odd():
print 'step 1'
yield 1
print 'step 2'
yield 3
print 'step 3'
yield 5
o=odd()
print o.next(),o.next(),o.next()

运行结果:

step 1 1 
step 2 3 
step 3 5
文章目录
  1. 1. 这样就会出现一些问题,比如我们不确定胡歌到底有多帅的时候,用这种逻辑写循环,就会造成只有第一步的判断运行过去了,也就是说胡歌仅仅是和KKW比较了帅气程度,直接得出了结果,然后程序结束;胡歌还没有运行到第三步即和霍建华比较判断,程序就已经结束了。这根本不科学,不符合实际情况。
  2. 2. 所以上面程序结果运行出来是喜欢他,而不是我想要的正确结果立刻娶他,这点在写程序中需要特别注意,容易出错。