前言
因为最近没事干想学下爬虫玩一下,顺便因为自己是信息安全专业,学一下py应该还蛮有趣的。
安装Python这些就不扯了
直接进入基础吧
数据
其实Python的数据类型和其他语言的差不多,大致也是以下几种
整数
Python可处理任意大小的整数。
由于计算机使用二进制,所以有时候用十六进制表示整数比较方便。
十六进制用0x
前缀和09,af表示。例如0xff00
浮点数
浮点数就是小数。
之所以叫他浮点数,是因为用科学计数法表示时,一个浮点数的小数点位置是可变的。就像1.23x10^9
和12.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' |
要注意区分ABC
和b'ABC'
。后者虽然内容和前者一样,但是bytes
的每个字符只占用一个字节。
以Unicode表示的str
都可以通过encjode()
方法编码为制定的bytes
。
1 | 'ABC'.encode('ascii') |
纯英文的str
可以用ASCII
编码为bytes
,内容是一样的。含有中文的str
可以用UTF-8
编码为bytes
。含有中文的str
无法用ASCII
编码,因为中文编码超过了ASCII
编码的范围,会报错。
反过来我们如果要从网络上读取字节流,就要把bytes
变为str
,需要用到decode()
方法:
1 | b'ABC'.decode('ascii') |
要计算长度,可以用len()
函数
由于Python源代码也是一个问本文件,所以当你的源代码包含中文的时候,为了避免乱码,应当自始至终用UTF-8编码,当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们常在开头上写:
1 | #!/usr/bin/env python3 |
第一行是为了告诉Linux/OS X系统,这是一个Python可执行程序
第二行是为了告诉Python解释器,按照UTF-8编码读取源代码。
我们经常会输出类似亲爱的xx您好!…
这种字符串。xx的内容是需要变化的
在Python中 ,这样的方式是用%
实现
1 | 'Hello, %s' % 'world' |
和许多语言一样,Python也有很多占位符
占位符 | 类型 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
格式化整数和浮点数还可以指定是否补0和整数与小数的位数。
1 | '%2d-%02d' % (3,1) |
如果你不确定要用什么,那就用%s
,就好比Objective-C中的%@
1 | 'Age: %s. Gender: %s' % (25,True) |
打印字符串
我们可以用print()
打印字符串。
Python允许用r''
标识''
内部的字符默认不转义。
1 | print('\\\t\\') |
如果字符串换行很多,写一行看着难受。Python还支持使用'''...'''
标识多行内容
1 | print('''line1 |
布尔值
在其他很多语言中我们用True
、False
标识布尔值,Python也不例外。
在Python中,布尔值可以用and
、or
和not
运算。
and
是与运算
or
是或运算
not
是非运算
空值
空值是Python中一个特殊值,用None
表示。
注意 None
不是0
,0
是有意义的。
变量
变量不仅可以是数字,还可以是任意数据类型。
变量名必须是大小写英文、数字和_
的组合。且不能以数字开头
Python是一门动态语言,变量本身类型不固定。我们可以把任意数据类型赋值给变量,同一个变量可以反复赋值。
常量
Python中常量一般都是全部大写。
事实上Python没有任何机制保证常量不会改变。所以全部大写常量名字只是一种习惯。
list与tuple
list
Python中有列表list
这种数据类型,是有序的集合,可以随时添加删除期中的元素。有点像objc中的MutableArray
1 | //list |
我们可以用len()
获得list元素的个数
1 | len(classmates) |
还可以用索引访问list的元素,甚至还可以直接获取倒数得到的数据
1 | 0] classmates[ |
list
里的数据类型也可以不同,可以是整型,可以是字符串,还可以是布尔值
1 | 'Apple', 123, True] L = [ |
也可以是另一个list
1 | 1, 2, [3, 4], 5] M = [ |
tuple
tuple和list非常相似,但是tuple一旦初始化就不能修改(除非里面有个list)。有点像objc中的NSArray
因为tuple不可变,所以相对来说是更安全的。
1 | //定义tuple |
条件判断
Python中也有if - else
语句
1 | age = 20 |
如果if
判断为True
,就把缩进的两行print语句执行了。
1 | age = 3 |
和你想的一样,这个elif
是else if
的缩写
if
的特点是从上往下判断,如果上面有一个判断为True
,就会忽略掉剩下的elif
和else
。
循环
Python的循环有两种,一种是for...in
循环,另一种是while
循环
for..in
for x in ...
循环就是把每个元素带入变量x
1 | //1-10累加 |
但只做累加 想加到1000页不可能一直手写。还好有range()
函数,可生成一个整数序列,再通过list()
可以转换为list
1 | list(range(5)) |
while循环
这个循环大家学啥语言基本都会遇到,也就不多赘述了
1 | sum = 0 |
dict和set
dict
Python内置了字典,也就是dict(dictionary)。和objc一样,使用键-值(key-value)存储。
1 | 'Michael':95, 'Bob':75, 'Tracy':85} d = { |
一个key只对应一个value没所以多次对一个key放入value,后面的值会覆盖掉前面。
1 | 'jack'] = 90 d[ |
dict内部存放的顺序和key放入的顺序没有关系。
dict的key必须是不可变对象
set
set和dict类似,也是一组key的集合,但是不存value。
1 | set([1, 2, 3]) s = |
set可看成数学意义上的无序无重复元素的集合,所以两个st可以做交并集等操作
1 | set([1, 2, 3]) s1 = |
set同样不能放入可变对象
函数
调用函数
Python内置了很多函数,我们可以直接调用(比如绝对值函数abs)
1 | //调用abs函数 |
如果传入的参数不对,会报TypeError
的错误
1 | //数据类型转换 |
定义函数
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号,最后,在缩进块中编写函数体,用return
返回。
1 | //自定义函数 |
如果我们把my_abs()
的函数定义保存为abstest.py
,那么,可以在该目录下启动Python解释器。用from abstest import my_abs
来导入my_abs()
函数
1 | //定义空函数 |
pass
可用来做占位符,比如我们还没想好写什么,可以先放一个pass
让代码跑起来
Python是可以返回多个值的
1 | def move(x, y, step, angle=0): |
其实返回的值并不是严格意义上的多值,而是一个tuple。