PY 语言基础

前言


因为最近没事干想学下爬虫玩一下,顺便因为自己是信息安全专业,学一下py应该还蛮有趣的。

安装Python这些就不扯了

直接进入基础吧

数据


其实Python的数据类型和其他语言的差不多,大致也是以下几种

整数

Python可处理任意大小的整数。

由于计算机使用二进制,所以有时候用十六进制表示整数比较方便。

十六进制用0x前缀和0~9,a~f表示。例如0xff00

浮点数

浮点数就是小数。

之所以叫他浮点数,是因为用科学计数法表示时,一个浮点数的小数点位置是可变的。就像1.23x10^912.3x10^8完全相等。

对于很大的数或很小的浮点数,就必须用科学计数法表示

在Python中文名用e替代10。也就是说1.23x10^9等价于1.23e9

字符串

字符串是以单引号和双引号"括起来的任意文本

单引号双引号都可以用,只要不混用。

如果'本来就是一个字符,那可以用""括起来。

如果字符串内又有"又有'的话。

熟悉的转义字符就出现了,还是老样子,还是用\标识

Python的字符串是以Unicode编码的,所以Python的字符串支持多种语言

Python的字符串类型是str,在内存中用Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str转化为bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示:

1
x = b'ABC'

要注意区分ABCb'ABC'。后者虽然内容和前者一样,但是bytes的每个字符只占用一个字节。

以Unicode表示的str都可以通过encjode()方法编码为制定的bytes

1
2
3
4
5
6
7
8
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File"<stdin>", line 1, in <module>
UnicodeEncodeError:'ascii' codec can't encode characters in position 0-1:ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的。含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码超过了ASCII编码的范围,会报错。

反过来我们如果要从网络上读取字节流,就要把bytes变为str,需要用到decode()方法:

1
2
3
4
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x97\x87'.decode('utf-8')
'中文'

要计算长度,可以用len()函数

由于Python源代码也是一个问本文件,所以当你的源代码包含中文的时候,为了避免乱码,应当自始至终用UTF-8编码,当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们常在开头上写:

1
2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行是为了告诉Linux/OS X系统,这是一个Python可执行程序

第二行是为了告诉Python解释器,按照UTF-8编码读取源代码。

我们经常会输出类似亲爱的xx您好!…这种字符串。xx的内容是需要变化的

在Python中 ,这样的方式是用%实现

1
2
3
4
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Dear %s , you have $%d' % ('Rues',7)
'Dear Reus , you have $7'

和许多语言一样,Python也有很多占位符

占位符 类型
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

格式化整数和浮点数还可以指定是否补0和整数与小数的位数。

1
2
3
4
>>> '%2d-%02d' % (3,1)
'3-01'
>>> '%.2f' % 3.1415926
'3.14'

如果你不确定要用什么,那就用%s,就好比Objective-C中的%@

1
2
>>> 'Age: %s. Gender: %s' % (25,True)
'Age: 25. Gender: True'

打印字符串

我们可以用print()打印字符串。

Python允许用r''标识''内部的字符默认不转义。

1
2
3
4
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\

如果字符串换行很多,写一行看着难受。Python还支持使用'''...'''标识多行内容

1
2
3
4
5
6
7
>>> print('''line1
line2
line3''')
line1
line2
line3

布尔值

在其他很多语言中我们用TrueFalse标识布尔值,Python也不例外。

在Python中,布尔值可以用andornot运算。

and是与运算

or是或运算

not是非运算

空值

空值是Python中一个特殊值,用None表示。

注意 None不是00是有意义的。

变量

变量不仅可以是数字,还可以是任意数据类型。

变量名必须是大小写英文、数字和_的组合。且不能以数字开头

Python是一门动态语言,变量本身类型不固定。我们可以把任意数据类型赋值给变量,同一个变量可以反复赋值。

常量

Python中常量一般都是全部大写。

事实上Python没有任何机制保证常量不会改变。所以全部大写常量名字只是一种习惯。

list与tuple

list

Python中有列表list这种数据类型,是有序的集合,可以随时添加删除期中的元素。有点像objc中的MutableArray

1
2
3
4
5
6
//list
>>> classmates = ['Reus', 'Reus1', 'Rues2']
>>> classmates
['Reus', 'Reus1', 'Reus2']
//空list
>>> c = []

我们可以用len()获得list元素的个数

1
2
3
4
>>> len(classmates)
3
>>> len(c)
0

还可以用索引访问list的元素,甚至还可以直接获取倒数得到的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
>>> classmates[0]
'Reus'
>>> classmates[1]
'Reus1'
//溢出
>>> classmates[3]
Traceback (most recent call last):
File"<stdin>". line 1, in <module>
IndexError: list index out of range
//查看最后一个元素
>>> classmates[-1]
'Reus2'
//倒数第二个
>>> classmates[-2]
'Reus1'
//越界溢出
>>> classmates[-4]
Traceback (most recent call last):
File"<stdin>". line 1, in <module>
IndexError: list index out of range
//追加元素
>>> classmates.append('Boy')
>>> classmates
['Reus', 'Reus1', 'Reus2', 'Boy']
//插入元素到指定位置
>>> classmates.insert(1,'May')
['Reus', 'May', 'Reus1', 'Reus2', 'Boy']
//删除末尾元素
>>> classmates.pop()
'Boy'
>>> classmates
['Reus', 'May', 'Reus1', 'Reus2']
//删除指定位置元素
>>> classmates.pop(1)
'May'
>>> classmates
['Reus', 'Reus1', 'Reus2']
//替换元素
>>> classmates[1] = 'Boy'
>>> classmates
['Reus', 'Boy', 'Reus2']

list里的数据类型也可以不同,可以是整型,可以是字符串,还可以是布尔值

1
>>> L = ['Apple', 123, True]

也可以是另一个list

1
2
3
>>> M = [1, 2, [3, 4], 5]
>>> len(M)
4

tuple

tuple和list非常相似,但是tuple一旦初始化就不能修改(除非里面有个list)。有点像objc中的NSArray

因为tuple不可变,所以相对来说是更安全的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//定义tuple
>>> t = (1,2)
>>> t
(1, 2)
//定义一个空的tuple
>>> t =()
>>> t
()
//定义一个元素的tuple
>>> t = (1,)
>>> t
(1,)
/**Python在显示只有一个的tuple时,也会加一个逗号,防止我们误解成数学上的括号**/

条件判断

Python中也有if - else语句

1
2
3
4
age = 20
if age >= 18:
print('your age is',age)
print('adult')

如果if判断为True,就把缩进的两行print语句执行了。

1
2
3
4
5
6
7
age = 3
if age >= 18:
print('adult')
elif age >=6:
print('tennager')
else:
print('kid')

和你想的一样,这个elifelse if的缩写

if的特点是从上往下判断,如果上面有一个判断为True,就会忽略掉剩下的elifelse

循环

Python的循环有两种,一种是for...in循环,另一种是while循环

for..in

for x in ...循环就是把每个元素带入变量x

1
2
3
4
5
//1-10累加
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum)

但只做累加 想加到1000页不可能一直手写。还好有range()函数,可生成一个整数序列,再通过list()可以转换为list

1
2
>>> list(range(5))
[0, 1, 2, 3, 4]

while循环

这个循环大家学啥语言基本都会遇到,也就不多赘述了

1
2
3
4
5
6
sum = 0
n = 99
while n > 0: //只要条件为真就一直循环
sum = sum + n
n = n - 2
print(sum)

dict和set

dict

Python内置了字典,也就是dict(dictionary)。和objc一样,使用键-值(key-value)存储。

1
2
3
4
5
6
7
8
>>> d = {'Michael':95, 'Bob':75, 'Tracy':85}
>>> d['Michael']
95
>>> d['Adam'] = 67
>>> d['Adam']
67

一个key只对应一个value没所以多次对一个key放入value,后面的值会覆盖掉前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> d['jack'] = 90
>>> d['jack']
90
>>> d['jack'] = 88
>>> d['jack']
88
//检查key是否存在
>>> 'Thomas' in d
False
>>> d.get('Thomas') //可返回None(交互命令行不显示结果)
>>> d.get('Thomas',-1) //或者自己写的value
-1

dict内部存放的顺序和key放入的顺序没有关系。

dict的key必须是不可变对象

set

set和dict类似,也是一组key的集合,但是不存value。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
//因为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}
//删除元素
>>> s.remove(4)
>>> s
{1, 2, 3}

set可看成数学意义上的无序无重复元素的集合,所以两个st可以做交并集等操作

1
2
3
4
5
6
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

set同样不能放入可变对象

函数

调用函数

Python内置了很多函数,我们可以直接调用(比如绝对值函数abs)

1
2
3
4
5
//调用abs函数
>>> abs(100)
100
>>> abs(-20)
20

如果传入的参数不对,会报TypeError的错误

1
2
3
4
5
6
7
8
9
10
//数据类型转换
>>> int(12.34)
12
>>> str(1.23)
'1.23'
//把函数名赋给变量
>>> a = abs
>>> a(-1)
1

定义函数

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

1
2
3
4
5
6
//自定义函数
def my_abs(x):
if x >= 0:
return x
else:
return -x

如果我们把my_abs()的函数定义保存为abstest.py,那么,可以在该目录下启动Python解释器。用from abstest import my_abs来导入my_abs()函数

1
2
3
//定义空函数
def nop():
pass

pass可用来做占位符,比如我们还没想好写什么,可以先放一个pass让代码跑起来

Python是可以返回多个值的

1
2
3
4
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny

其实返回的值并不是严格意义上的多值,而是一个tuple。

参考


廖雪峰的官方网站