简介
当问答网站基本框架搭建完毕之后需要一些初始的数据来进行填充,因此选用Python爬虫的方式,从网上截取一些资料信息(当然是自己做项目使用,非商用)放入到项目网站上面。这篇主要是关于Python基础知识的学习笔记。
Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。它具有以下特点:
- 语法简单:便于初学者学习,易于理解,同时也方便维护。
- 广泛的标准库:具有丰富的库,跨平台性,兼容性好。
- 可移植性:基于开放源代码的特性,可以移植到多种平台。
- 可拓展性:可以用其他方式编写代码,比如c++等,然后在Python中调用。
- 数据库: 提供了所有的商业数据库。
当然还会有一些其他特性,这些特性也不是我自己总结的,详细的内容你可以参照下面链接进行深入学习。
Python3教程 | 菜鸟教程 https://www.runoob.com/python3/python3-intro.html
Python环境搭建及IDE安装
- 要学习Python,首先应该在你的操作系统上面搭建python的运行环境,对于本项目我们选用了安装windows版Python3,当然Python3和之前的Python2.x版本相比发生了一些变化,比如print函数、除法运算、异常等,如果您想深入了解可以通过下面链接深入学习:Python3与Python2.x的区别
你可以通过下面链接直接通过Python官网下载:Python官网
具体的Python安装步骤以及环境搭建教程可以参考:Python安装教程
当你参照上面教程安装好Python之后,打开cmd,输入:
python
会显示你安装Python的版本号等一些信息,如果显示Python为外部命令说明你并没有安装成功,那么请检查你是否是不是将Python添加到环境变量当中或者你下载的是否版本与你的操作系统是否匹配,从网上你会找到相应的解决方案。
- 当然,你可以通过命令行的形式编译运行Python程序,但有时候并不是很方便,因此我们可以通过通过一些集成开发环境来运行Python程序,在本项目中我选用了PyCharm,因为我在编写java程序时就选用了同一家公司生产的IntelliJ IDEA 感觉比较好用。下面是是PyCharm的下载地址以及安装教程地址:
PyCharm下载地址:PyCharm下载链接
PyCharm安装教程:PyCharm安装教程链接
安装完毕之后,如果你没有使用正版,你可以从网上查找最近的密钥完成激活,当你这些步骤都操作完毕之后,你就可以使用PyCharm,然后尝试建立自己第一个Python项目了。
可以仿照下面的顺序建立自己的第一个Python项目:New Project ->编写项目路径 -> New -> Python File
另外,当你编写Python代码时,可能每次都需要写下它的解释器路径信息以及字符集,即是:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
比较麻烦,你可以将它们放到模板当中,这样每次它都会自己加上,不需要自己在加上:
File -> Settings -> Editor -> File and Code Templates -> Python Script -> 添加上面两句代码即可
做完这些你就可以我们就开始python学习了。
Python基础语法
中文编码
Python默认的编码是ASCII编码,因此中文无法进行正常打印,读取中文时会发生错误,因此需要修改编码格式,采用通用的utf-8编码,只需要在开头加入
#-*- coding:utf-8 -*-
我们在上面模板已经加入,因此不需要再添加。
标识符
Python的标识符是由字母、数字、下划线组成,不能以数字开始,同时严格区分大小写。而以下划线开始结尾的在Python都具有特殊的含义:
- 以单下划线开头的代表不能直接访问的类属性,需要通过类提供的接口访问,类似于java中的getter方法。
- 以双下划线开始的代表类的私有成员。
- 以双下划线开始同时双下划线结尾的代表Python的特殊方法的标识,比如类的构造函数:__init__().
保留字
Python的保留字代表语言中已经定义使用的,用户不能再使用的标识符,所有的Python关键字只包含小写字母。
import keyword
print(keyword.kwlist)
可以通过上面的代码打印Python的关键字。
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del',
'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
空行与缩进
刚开始学习写Python代码时感觉有些不适用,Python不需要通过大括号来控制类、函数、以及一些逻辑判断,仅仅通过缩进类进行操作。相同的代码块必须使用相同的缩进尺寸,否则将会报错,或者得到想象不到的结果。
Python通过空行来区分函数或者类,但是空行并不是Python的语法,因此不加空行也不会报错,加空行是为了后期维护。
print("hello Python 1")print("hello Python2")
将会出现下面的错误:
File "F:/pythonstudy/test1.py", line 4print("hello Python2")^
IndentationError: unexpected indent
多行语句及一行多条语句
Python是以一个新行作为一条语句的结束,但是当你的一条语句过长时想使用另起一行书写时,应该使用反斜杠( \ ) 连接,如果你想换行书写的内容在括号内那么久不需要添加反斜杠进行连接了。
另外,当一行需要书写多条语句时,可以通过分号进行分割。
注释
Python的注释有三种:
- 单行注释: 以 # 开始这一行就会被注释。
- 多行注释: 可以使用6个双引号""“注释内容”"" 或者6个单引号’’’ 注释内容’’’
# 单行注释
"""
多行注释1
"""
'''
多行注释2
'''
引号
Python可以使用单引号、双引号、三引号("""或者’’’)表示字符串,但是引号开始和结束的必须是相同的数据类型,三引号可以表示多行字符串,而且使用三引号输出与你输入的格式一样,可以用来写一些html程序文本。
str1 = 'hello Python'
str2 = "hello Python"
str3 = """hello
Python"""
str4 = '''hello
Python
hello Python
hello Python
'''
print(str4)
结果为:
hello
Python
hello Python
hello Python
print函数
感觉Python的print函数很强大,它会自己识别你要打印的变量类型,进而选择对应的print重载函数进行打印操作。另外,print函数默认输出换行,如果你不想换行,那么你需要在变量末尾添加end=""。
print("hello Python 1")
h1 = 10
h2 = True
print(h1, h2)
print(h1, end="")
list1 = ["hello", 1, "Python"]
print(list1)
输出结果为:
hello Python 1
10 True
10['hello', 1, 'Python']
import 及 from … import
在Python中引入某个模板使用import和java中一致,不同的是,Python中还有from…import的用法:
- 导入整个模板:import 模板名
- 导入某个模板中的某个函数:from 模板名 import 函数名
- 导入某个模板中多个函数: from 模板名 import 函数1名,函数2名
- 导入某个模板中全部函数,可以使用通配符:from 模板名 import *
Python基本数据类型
变量赋值
与java或者c++不同,Python的变量不需要声明,但是在使用前必须赋值,这有些像Matlab语言的使用,变量赋值之后才会被创建,而且对于Python来说,变量没有类型,也即是在内存中的对象的类型。
- 使用等号(=)对变量赋值。
- 可以使用连等号对多个变量赋值,同时也可以使用一个等号对多个变量赋值。
h = 0
h1 = h2 = h3 = 1
h4, h5, h6 = 2, True, "hello Python"
标准数据类型
Python共有六个标准数据类型:
- Number 数字
- String 字符串
- List 列表
- Tuple 元组
- Set 集合
- Dictionary 字典
同时这六种标准数据类型又可以分成两大类: - 不可变数据:Number、String、Tuple
- 可变数据:List、Set、Dictionary
顾名思义,不可变数据就是一旦创建,你不可以修改其中的元素,而可变数据,你可以修改变动其中的元素。
Number
Python共支持四种数字类型变量:
- int 整型
- float 浮点型
- bool 布尔型
- complex 复数型
看到复数型再次感到Python的便捷,你可以通过type()函数进行判断一个变量的数据类型,或者通过isinstance来判断:
print(type(h))
print(isinstance(h, int))
区别在于:
- type() 判定子类不属于父类型
- ininstance() 判定子类是父类型
需要注意的是:
- Python3中bool型数据也是一种数字,True和False代表着1和0,可以进行数字运算
- 你可以使用 del 删除单个或者多个变量, del 变量名1, 变量名2
- 一个变量可以使用赋值指向不同类型的变量,因为没有声明,所以不会出现向java或者c++中的类型错误
- Python的除法,/ 返回一个浮点型, // 返回一个整型
- 混合运算时,Python会把整型变成浮点型
常用的函数:
用于数学计算的:
函数 | 返回值(描述) |
---|---|
abs(x) | 返回数字x的绝对值 |
ceil(x) | 返回数字x的的上入整数 |
exp(x) | 返回e的x的次幂 |
fabs(x) | 返回数字x的绝对值,返回浮点值 |
floor(x) | 返回数字x的下舍整数 |
log(x) | 返回数字x的对数,可以添加底的值,e或者10,log(x,e)或者log(x,10) |
log10(x) | 返回数字x的以10 为底的对数 |
max(x) | 返回序列x的最大值 |
min(x) | 返回序列x的最小值 |
modf(x) | 返回数字x的整数部分和小数部分,整数部分为浮点值 |
pow(x,y) | 返回数字x的y次幂 |
round(x,n) | 返回数字x的四舍五入n位 |
sqrt(x) | 返回数字x的开根号 |
用于随机函数的:
函数 | 返回值(描述) |
---|---|
choice(seq) | 从seq序列中随机挑选出来一个 |
randrange(start,stop,step) | 从指定范围内,按照指定基数递增的集合中随机选取一个数 |
random(x) | 在 (0,1) 之间随机生成一个数 |
seed(x) | 改变随机数生成器的种子seed |
shuffle(x) | 将序列中的元素随机排序 |
uniform(x,y) | 在 [x,y] 之间随机生成一个数 |
用于三角函数:
函数 | 返回值(描述) |
---|---|
cos(x) | 返回x的余弦值 |
sin(x) | 返回x的正弦值 |
tan(x) | 返回x的正切值 |
asin(x) | 返回x的反正弦弧度值 |
acos(x) | 返回x的反余弦弧度值 |
atan(x) | 返回x的反正切弧度值 |
degrees(x) | 返回弧度x的角度值 |
radians(x) | 返回角度x的弧度值 |
另外,还有一些常量值:
常量 | 描述 |
---|---|
pi | 圆周率 |
e | 自然常量 |
String
Python只用单引号或者双引号,或者 \ 进行转义特殊字符。
Python中字符串的索引值采用两种:
- 从前面开始为:0 1 2 3…
- 从后面开始为:-length,…, -2, -1
另外,可以使用中括号进行字符串的截取:
str = 'helloPython'
print(str) # 打印整个字符串
print(str[0:-1]) # 打印第一个到倒数第二个
print(str[0]) # 打印第一个
print(str[2:5]) # 打印第三个到第五个
print(str[2:]) # 打印第二个之后的包含第二个
print(str * 2) # 重复打印字符串
print(str + "nihao") # 字符串的连接
对于特殊字符的转义,可以采用反斜杠,如果你不想进行转义,可以在字符串前面添加字母r:
print("hello\nrunoob")
print(r"hello\nrunoob")
Python的一些转义字符:
转义字符 | 描述 |
---|---|
\ (在行尾) | 续行符 |
\ \ | 反斜杠 |
\ ’ | 单引号 |
\ " | 双引号 |
\ n | 换行 |
\ r | 回车 |
\ f | 换页 |
\000 | 空 |
\oyy | 八进制数,yy代表字符 |
\ xyy | 十六进制数,yy代表字符 |
例如:
print('\o12')
print('\x0a')
另外,Python可以进行格式化输出,类似java中的String.format函数。下面列举了一些常用的格式化符号:
符号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整数 |
%f | 格式化浮点数,可以指定小数点后的精度 |
例如:
ee = 11.55555
print("ee 的数值为:%.2f" % ee)
结果为:
ee 的数值为:11.56
Python中String还有一些常见的内建函数:
在这里列举几种常用的:
序号 | 方法及描述 |
---|---|
1 | count(str, start, end) 返回在指定范围内,str重复的次数 |
2 | find(str, start, end) 返回在指定范围内,str是否存在,若存在返回索引值,否则返回-1 |
3 | index(str, start, end) 与find一样,但是如果str不存在会报异常 |
4 | len(str) 返回字符串的长度 |
5 | lower(str) 将str都变为小写 |
6 | rstrip(str) 删除字符串末尾的空格 |
7 | split(s, str) 将s以str切割 |
8 | upper(str) 将str变成大写 |
9 | join(seq) 将序列seq以指定的符号连接变成大写 |
10 | lstrip(str) 删除字符串开始的空格 |
import keyword
print("\n".join(keyword.kwlist))
List
类似于java中的List或者c++中的vector,不同的是Python中的List不存在类型检查,你可以在一个列表中添加不同类型的数据,甚至添加另一个列表,列表的元素可以修改变化。它的索引值定义和String一样,索引值以0位开始值,-1位末尾的开始位置,同样可以使用中括号来获取变量:
# 和String的含义一样
list1 = [1, 2, 3]
list2 = [6, 7, 8]
list = ["abc", 1, 2, 3, 4, list1, True]
print(list)
print(list[0])
print(list[0:3])
print(list[3:])
print(list * 2)
print(list + list2)
print(list[1:6:2]) # 从第2个元素开始到第7个元素,以步长为2选择,不包含第7个元素
结果为:
['abc', 1, 2, 3, 4, [1, 2, 3], True]
abc
['abc', 1, 2]
[3, 4, [1, 2, 3], True]
['abc', 1, 2, 3, 4, [1, 2, 3], True, 'abc', 1, 2, 3, 4, [1, 2, 3], True]
['abc', 1, 2, 3, 4, [1, 2, 3], True, 6, 7, 8]
[1, 3, [1, 2, 3]]
Python中List函数:
序号 | 函数 |
---|---|
1 | len(list) 列表的元素个数 |
2 | max(list) 列表的元素最大值 |
3 | min(list) 列表的元素最小值 |
4 | list(seq) 将元组转化为列表 |
5 | list.append() 在列表最后添加一个元素 |
6 | list.count() 列表元素的个数 |
7 | list.extent(seq) 在列表最后添加一个序列 |
8 | list.index(obj) 返回obj的索引 |
9 | list.insert(index, obj) 在列表index插入一个元素 |
10 | list.pop() 弹出列表最后位置的元素 |
11 | list.remove(obj) 将obj从列表中移除 |
12 | list.reverse() 反转列表 |
13 | list.sort() 排序 |
14 | list.clear() 清空列表 |
15 | list.copy() 复制列表 |
Tuple
可以看做是元素不可以变化的List,有以下几点区别:
- 元素不可以修改
- 元素写在小括号中
- 构造空元组或者一个元素的元组需要注意特殊写法
tuple1 = () # 空元组
tuple2 = (1,) # 一个元素元组
tuple3 = (1, 2, "hello", True, tuple1)
tuple4 = tuple2 + tuple3
Set
Python中的Set是由一个或者多个形态各异的大小整体组成,构成了集合的事物或者对象被称为元素或者成员。可以进行成员的关系测试或者删除重复的元素。使用大括号或者set() 函数创建,需要注意的是:创建一个空集合必须用set函数,因为{ }是创建一个空字典。
set1 = {"hello", "Python", 1, True, "Hi"}
# 关系测试
if "hello" in set1:print("Yes")
else:print("No")# 集合运算
setA = set("abcd")
setB = set("cdef")
print(setA - setB) # 差集
print(setA | setB) # 并集
print(setA & setB) # 交集
print(setA ^ setB) # 两个集合不同时存在的元素
结果是:
Yes
{'b', 'a'}
{'d', 'f', 'b', 'a', 'e', 'c'}
{'d', 'c'}
{'f', 'a', 'e', 'b'}
Python中Set的内置函数:
序号 | 函数 |
---|---|
1 | add() 添加一个元素 |
2 | clear() 清空所有元素 |
3 | discard() 删除指定元素 |
4 | difference() 返回多个集合的差集 |
5 | intersection() 返回集合的交集 |
6 | issubset() 判断是不是子集 |
7 | symmetric_difference() 返回两个集合不重复的元素 |
8 | remove() 删除指定元素,若不存在发生错误 |
9 | pop() 随机删除一个元素 |
10 | update() 添加元素 |
Dictionary
Dictionary(字典)是一种无序的对象集合,它保存的是键值对,通过键来取值,和java中的map有些类似。
- key必须是不可变类型变量
- 大括号进行标识
- 同一个字典中键需要唯一
- 创造空字典使用 { }
其中key必须是不可变类型变量,通过大括号进行标识,同一个字典中键需要唯一。
dictionary1 = {"key1": "hello1", 1:"hello2", "key3":"hello3"}
print(dictionary1["key1"])
print(dictionary1[1])
print(dictionary1)
print(dictionary1.keys())
print(dictionary1.values())
print(dictionary1.__len__())
dictionary1["key4"] = 4 # 为字典添加新的元素
可以使用dict() 直接根据键值对序列构造字典:
dictionary2 = dict([("key1", 1), ("key2", 2), ("key3", 3)])
print(dictionary2)
Python中Dictionary的内置函数:
序号 | 函数 |
---|---|
1 | dic.clear() 清空字典中元素 |
2 | dic.get(key) 获得键为key的value |
3 | dic.items() 返回字典的键元组数组 |
4 | dic.keys() 返回一个迭代器,可以用list() 来转化列表 |
5 | dic.updata(dict) 将键值对更新到字典中 |
6 | dic.values() 返回一个迭代器,可以用list() 来转化列表 |
7 | pop(key) 删除字典给定key对应的值,返回被删除的value |
Python数据类型转换
当需要将一个数据类型转化为另一个数据类型时,只需要将你要转化的数据类型当做函数名就好:
函数 | 描述 |
---|---|
int(x) | 将x转化为一个整数 |
float(x) | 将x转化为一个浮点数 |
complex(real,imag) | 创建一个复数 |
str(x) | 将x转化为字符串 |
eval(x) | 计算字符串中有效的Python表达式 |
repr(str) | 计算字符串中有效Python表达式,返回一个对象 |
tuple(x) | 将x转化为一个元组 |
list(x) | 将x转化为一个列表 |
set(x) | 将x转化为一个可变集合 |
dict(x) | 创建一个字典,其中x必须是(key,value) 的元组 |
frozenset(s) | 将s转化不可变集合 |
chr(x) | 将整数x转化为一个字符 |
ord(x) | 将字符x转化为一个整数 |
hex(x) | 将整数x转化为它的十六进制字符串 |
oct(x) | 将整数x转化为它的八进制字符串 |
x = 3
print(eval("x + 4"))
>> 7
Python运算符
Python支持以下几种运算符:
- 算术运算符
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法,返回浮点型 |
% | 取模 |
** | 幂,x**y,返回x的y次幂 |
// | 取除法结果的整数部分,若分子分母有一个是浮点数,则结果也为浮点数 |
- 比较运算符
运算符 | 描述 |
---|---|
== | 比较两个对象是否相同 |
!= | 比较两个对象是否不相同 |
> | 是否大于,返回True或者False |
< | 是否小于,返回True或者False |
>= | 是否大于等于,返回True或者False |
<= | 是否小于等于,返回True或者False |
- 赋值运算符
运算符 | 描述 |
---|---|
算术运算符=(比如+=、-=等) | 表示先进行算术运算,然后把结果返回给变量 |
:= | 海象运算符,用于表达式内部为变量赋值。Python3.8增加 |
- 逻辑运算符
运算符 | 描述 |
---|---|
and | 逻辑与,返回True或者False |
or | 逻辑或,返回True或者False |
not | 逻辑非,返回True或者False |
- 位运算符
运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 ,这是一个单元运算符 |
<< | 左移运算符,高位丢弃,低位补0 |
>> | 右移运算符,低位丢弃,高位补0,符号位不变 |
- 成员运算符
运算符 | 描述 |
---|---|
in | 如果在指定的序列中返回True,否则返回False,包括字符串、列表或元组 |
not in | 如果不在指定的序列中返回False,否则返回True,包括字符串、列表或元组 |
- 身份运算符
运算符 | 描述 |
---|---|
is | 判断两个标识符是不是引用同一个对象 |
is not | 判断两个标识符是不是引用不同对象 |
另外,需要注意的是id() 函数用于获取对象的内存地址。
def isSame(aa, bb):if aa is bb:print("aa is bb")else:print("aa is not bb")if id(aa) == id(bb):print("id(aa) == id(bb)")else:print("id(aa) != id(bb)")aa = 10
bb = 10
isSame(aa, bb)
bb = 20
isSame(aa, bb)
结果为:
aa is bb
id(aa) == id(bb)
aa is not bb
id(aa) != id(bb)
运算优先级
Python运算符优先级与其他语言相似,由高到低:
运算符 | 描述 |
---|---|
** | 幂 |
~ - + | 按位取反, 一元加法减法 |
* / % // | 乘、除、取模、整除 |
+ - | 加减 |
>> << | 右移 左移 |
& | 位与 |
^ | | 位异或,或 |
<= >= < > | 比较运算符 |
== != | 等于运算符 |
= 算术运算符= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not and or | 逻辑运算符 |
Python语句
条件控制
与java或者c++中一样,就是需要注意if-elif-else之间的匹配,还有就是各个语句之间的缩进:
mn = 10
if mn < 100:print(mn)if mn < 20:print(mn)elif mn < 30:print(mn)else:print(mn)
elif mn < 200:print(mn)
else:print(mn)
循环语句
- while-else循环语句
num = 1
while num < 10:-num
else:print(num)
- for-else循环语句
listS = ["A", "B", "C"]
for num1 in listS:print(num1)
else:print("Have null")
同时,for可以与range() 函数结合使用:
for ii in range(5):print(ii, end=" ")
结果是:
0 1 2 3 4
需要注意的是,continue和break的使用,与java和c++一样:
- continue跳出本次循环,执行下一次循环
- break直接跳出循环
还有一个pass() 函数,用来占位使用,是空语句,是为了保证代码的完整性。
总结
这是一篇关于Python的学习笔记,许多内容都是借鉴别人的,都比较简单的只是,好多内容和java或者c++都有重叠,还有好多深入的东西没有介绍,以后会补充。最后,感谢菜鸟教程提供的学习资料。
Python3 教程 | 菜鸟教程 https://www.runoob.com/python3/python3-tutorial.html