python3学习笔记(学完了 没记全)

python3学习笔记(学完了 没记全)

初学python,不想一上来就直接写helloworld,了解一门语言的发展和语言的特性也是非常重要的,所以笔记会比较详细。

python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
python具有很强的可读性。
python3相对python2是较大的一个升级并且没有考虑向下兼容。

简介

  • python是解释型语言
  • python是交互式语言
  • python是面向对象的语言
  • python是初学者的语言

发展历史

Python 2.0 于 2000 年 10 月 16 日发布,增加了实现完整的垃圾回收,并且支持 Unicode。
Python 3.0 于 2008 年 12 月 3 日发布,此版不完全兼容之前的 Python 源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。
Python 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。
Python 2.7 被确定为最后一个 Python 2.x 版本,它除了支持 Python 2.x 语法外,还支持部分 Python 3.1 语法。

特点

  • 易于学习
  • 易于阅读
  • 易于维护
  • 广泛的标准库
  • 交互模式
  • 可移植
  • 可扩展
  • 数据库
  • GUI编程
  • 可嵌入

缺点

  • 运行速度较慢
  • 国内使用较少
  • 中文文档少

应用领域

  • 云计算
  • web
  • 科学计算、人工智能
  • 运维
  • 金融
  • GUI
  • 爬虫
  • 等等还有很多

查看版本

查看python版本:

1
python3 -V

可以输入 python3 命令进入交互式编程界面。

HelloWorld

1
2
#!/usr/bin/python3
print("Hello World!")

python解释器建议写法:

1
#!/usr/bin/env python3

将上面的代码保存为HelloWorld.py,然后使用python3命令运行。

环境搭建

安装python

python官网:https://www.python.org/

在官网下载源码编译安装或者直接下载安装包即可,macos和linux可以使用包管理器安装。

运行python

  1. 交互解释运行(python命令,ipython)
  2. python命令运行文件
  3. IDE、编辑器中运行(pycharm,vscode)

基本语法

标识符

  1. 必须以字母或者下划线_开头。
  2. 标识符的其他的部分由字母、数字和下划线组成。
  3. 大小写敏感。
  4. 在python3中,可以用ASCII字符作为标识符包括汉字。

python标识符保留字:

使用下面的方法查询保留的关键字:

1
2
import keyword
keyword.kwlist

注释

1
2
3
4
5
6
7
8
9
# 单行注释

'''
多行注释
'''

"""
多行注释
"""

行与缩进

python使用缩进来表示代码块。

1
2
3
4
if True:
print ("True")
else:
print ("False")

多行语句

1
2
3
total = item_one + \
item_two + \
item_three

[], {}, ()中使用多行语句不需要斜杠。

Number类型

  • int: 1
  • bool: True, False
  • float: 1.23
  • complex: 1 + 2j、 1.1 + 2.2j

String类型

1
2
3
4
5
6
name = 'Mason'
name = "Mason"
full_name = '''my name is
Mason'''
full_name = """my name is
Mason"""
  • 单行字符串使用单引号或者双引号包裹。
  • 多行字符串使用三引号'''或者"""包裹。
  • 转义字符\,使用r可以阻止转义。
  • 字符串使用+拼接,可以使用*重复字符串。
  • 字符串两种索引方式:从左往右(0开始),从右往左(最右边的索引是-1)。
  • 字符串中的字符不能改变。
  • python中只有字符串没有字符。

阻止转义:

1
2
print('hello\nworld')
print(r'hello\nworld')

截取字符:变量[头下标: 尾下标: 步长]

1
2
3
4
5
6
name = 'Mason'
print(name[0])
print(name[0:3])
print(name[0:])
print(name[0:-1])
print(name[0:-1:2])

空行

函数之间、类方法之间、类和函数入口之间都要用空行隔开,便于区分。

用户输入

1
input('\n\n请输入并以回车结束')

多条语句

使用分号分隔多条语句。

代码组

比如:

1
2
3
4
5
6
if exp1:
suite
elif exp2:
suite
else:
suite

print输出

print输出默认换行。

1
2
3
4
5
6
7
name = 'Mason'

# 默认换行
print(name)

# 加参数不换行
print(name, end=' ')

import和from…import

使用import和from…import来导入模块。

导入模块: import module

导入模块中的一个函数: from module import function

导入模块中的多个函数: from module import function1, function2, function3

导入模块中的全部函数: from module import *

基本数据类型

python中的数据类型不需要声明,直接赋值。
python中的变量是弱类型的。

1
2
3
name = 'Mason'
age = 22
balance = 10000.5

赋值多个变量

1
a = b = c = 1

还有类似es解构赋值的赋值方式:

1
a, b, c = 'mason', 1, 3.14

标准数据类型

  • Number:数字
  • String:字符串
  • List:列表
  • Tuple:元祖
  • Set:集合
  • Dictionary:字典

注意布尔型属于Number类型。

其中,分为可变数据类型和不可变数据类型

可变类型:Number, String, Tuple
不可变类型:List, Set, Dictionary

Number

分为:int(长整型), float, bool, complex

使用 type() 可以查询变量指向的数据类型。

1
2
3
type(1)
# <class 'int'>
# 其他类型<class 'float'> <class 'bool'> <class 'complex'>

还可以用 isinstance() 判断类型。

1
2
isinstance(1, int)
# True

两者的区别: type() 不会认为子类是一种父类类型,而 isinstance() 会认为是。

bool是int的子类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
issubclass(bool, int) 
# True

True == 1
# True

False == 0
# False

True + 1
# 2

False + 1
# 1

1 is True
# False

0 is False
# False

删除变量引用:

1
2
del myname
del myname, age

数学计算:

使用: + (加法), - (减法), * (乘法), / (除法,得到浮点数), // (除法,得到整数), % (求余数), ** (乘方)

complex类型:是复数,由实部和虚部组成 a+bj ,或者 complex(a, b) ,a和b都是浮点型。

String

省略的部分笔记参考上一章节。

反斜杠还可以作为续行符:

1
2
3
4
str = 'my name is\
Mason
'
# my name is Mason

也可以使用三引号跨行。

List

List(列表)就是数组,形如 ['abc', 123, False]

空列表: []

List中的每一个元素可以是任何类型。

截取List中的元素的方法和上面的String截取方式一样。

List中的+和*:

1
2
3
4
5
6
7
8
9
10
list1 = ['abc', 123]
lsit2 = [345, 'efg']

# 使用乘号可以重复
print(list1*2)
# ['abc', 123, 'abc', 123]

# List可以通过加号拼接
print(list1 + list2)
# ['abc', 123, 345, 'efg']

List中的元素可以改变。

1
2
3
4
5
6
7
8
9
10
list = [1, 2, 3, 4, 5, 6]

list[0] = 0
# [0, 2, 3, 4, 5, 6]

list[1:4] = [7, 7, 7]
# [0, 7, 7, 7, 5, 6]

list[1:-1] = []
# [0, 6]

List也可以像String一样设置步长来跳着选取元素。

1
2
3
4
list = [1, 2, 3, 4, 5, 6]

print(list[0:5:2])
# [1, 3, 5]

翻转句子词语顺序实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 翻转句子词序
def reverseWords(sentence):
# 先将句子通过空格分割为List
sentenceList = sentence.split(' ')

# 翻转句子sentenceList
reversedSentenceList = sentenceList[-1::-1]

# 再将reversedSentenceList转为String并返回
return ' '.join(reversedSentenceList)

# test
if __name__ == '__main__': # WTF
s = 'my name is Mason'
print(reverseWords(s)) # Mason is name my

Tuple

Tuple与List类似,不过元组中的元素不能修改,而且放在小括号()中,使用逗号隔开。
Tuple的其他用法和List一致。

字符串可以看成是一种特殊的元组。

实例:

1
tuple = (123, 'abc')

空元组: ()

一个元素的元组这样写: (10,)

一个元素的列表可以这样写: [10]

String, List, Tuple都属于序列。

Set

集合(Set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。

Set可以用于成员关系测试和删除重复元素。

创建空的Set只能用 set()

创建一个Set:

1
2
3
newSet = {elem1, elem2, elem3}

newSet = set(elem1)

Set实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Set去重
newSet = {'a', 'b', 'c', 'd', 'a'}
print(newSet) # {'a', 'b', 'c', 'd'}

# 测试一个值是否是Set的成员
if 'a' in newSet:
print('true')
else:
print('false')

# Set的集合运算
a = {1,2,3,4}
b = {3,4,5,6}

# 交集运算
print(a & b)
# 并集运算
print(a | b)
# 差集运算
print(a - b)
# a和b中不同时存在的元素,相当于a-b和b-a的并集
print(a ^ b)
print(a-b | b-a)

Dictionary

字典是无序对象的集合,就相当于js里面的对象。
字典使用{}包裹,里面是键值对。
key必须是不可变类型String, Number, Tuple,且key必须唯一。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建一个字典并向里面添加键值对
dict = {}
dict['name'] = 'mason'
dict[1] = 123

# 直接赋值一个字典
dict = {
'name': 'mason',
'age': 22
}

# 使用字典
print(dict['name'])
print(dict(1))
print(dict.keys())
print(dict.values())

可以使用 dict() 构建字典,传入参数为序列。

数据类型转换

int(x [,base]) : 将x转换为一个整数

float(x) : 将x转换到一个浮点数

complex(real [,imag]) : 创建一个复数

str(x) : 将对象 x 转换为字符串

repr(x) : 将对象 x 转换为表达式字符串

eval(str) : 用来计算在字符串中的有效Python表达式, 并返回一个对象

tuple(s) : 将序列 s 转换为一个元组

list(s) : 将序列 s 转换为一个列表

set(s) : 转换为可变集合

dict(d) : 创建一个字典。d 必须是一个 (key, value)元组序列。

frozenset(s) : 转换为不可变集合

chr(x) : 将一个整数转换为一个字符

ord(x) : 将一个字符转换为它的整数值

hex(x) : 将一个整数转换为一个十六进制字符串

oct(x) : 将一个整数转换为一个八进制字符串

数据类型转换

  • 隐式转换(自动)
  1. 两个不同数据类型之间进行运算的时候,python会自动将低精度数据类型转换为高精度数据类型。
  2. 将数字和字符串进行加法操作会报错。
  • 显式转换(手动)

参考上一张最后的api。

推导式

推导式是一种数据处理方式,可以将一个数据序列转为另一个数据序列。

列表推导式

1
2
3
4
5
[表达式 for 变量 in 列表]
[out_exp_res for out_exp in input_list]

[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]

实例:过滤掉小于等于3的数并返回新的List

1
2
nums = [1, 2, 3, 4, 5, 6]
nums_filtered = [num for num in nums if num > 3]

字典推导式

1
2
3
{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

实例:将一个List通过字典推导式转为Dictionary

1
2
3
4
list = ['abc','abcd', 'abcde']

dict = {key:len(key) for key in list}
# {'abc': 3, 'abcd': 4, 'abcde': 5}

集合推导式

1
2
3
{ expression for item in Sequence }

{ expression for item in Sequence if conditional }

实例:计算集合中元素的平方

1
2
set = {item**2 for item in (1,2,3)}
# {1,4,9}

元组推导式

1
2
3
(expression for item in Sequence )

(expression for item in Sequence if conditional )

元组推导式返回的是生成器对象。

1
2
3
4
5
# tuple_object是生成器对象
tuple_object = (item for item in rrange(1,10))

# 将生成器对象转为元组
tuple(tuple_object)

解释器

1
2
3
4
5
6
7
8
# 运行python脚本
python3 main.py

# 赋予脚本执行权限
chmod +x main.py

# 执行脚本
./main.py

注释

1
2
3
4
5
6
7
8
9
# 单行注释

'''
多行注释
'''

"""
多行注释
"""

运算符

python中有以下运算符。

  • 算术运算符:+ - * / % ** //
  • 比较运算符:== != > >= < <=
  • 赋值运算符:= += -= = /= %= *= //= :=(海象运算符)
  • 逻辑运算符:and or not
  • 位运算符:& | ^ ~ << >>
  • 成员运算符:in, not in, 支持List,String,Tuple
  • 身份运算符
    • is:判断两个变量是否是同一个对象的引用,a is b,相当于id(a)==id(b)。
    • is not:参上
    • id():用于获取变量的内存地址。
1
2
3
4
5
6
7
8
9
a = 10
b = 10

a is b
# True

b = 20
a is b
# False

is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。

注意and比or优先级高。

数字

要引入math包:import math

下面的api都要用math.round()的形式写。

1
2
3
4
5
6
num = 3.14
a = 1
b = 2

# 删除变量对于对象的引用
del a,b

Number的类型:

  • int:整形或者说可以作为long使用,bool型是int的子类型。
  • float
  • complex:复数,a+bj或者complex(a, b),其中a和b都是float。

数字类型转换

  • int()
  • float()
  • complex()

数字运算

参考之前的章节。

交互模式中,最后被输出的表达式结果会被赋值给_。

数学函数

  • sqrt():开方
  • abs()
  • ceil()
  • floor()
  • round(x, n):四舍五入精确到n位
  • cmp(x, y)
  • exp(x)
  • pow(x, y)
  • fabs()
  • log()
  • log10()
  • max(x1, x2, …xn)
  • min(x1, x2, …xn)
  • modf(x):返回x的整数部分和小数部分。

随机数函数

  • choice():从参数序列中随机挑选一个,random.choice(range(10))
  • randrange(start, stop, step):从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
  • random():生成一个随机数,范围[0, 1)
  • seed()
  • shuffle(list):将list打乱随机排列。
  • uniform(x, y):随机生成一个[x, y]之间的实数。

三角函数

就是各种正弦余弦,反正弦反余弦。

常量

  • pi:圆周率π
  • e:自然常数e

字符串

和之前字符串重复的地方不作笔记。

转义字符

  • \在行尾:作为续行符
  • \\:反斜杠
  • \':单引号
  • \a:响铃
  • \b:退格
  • \000:空
  • \n:换行
  • \t:横向制表符
  • \v:纵向制表符
  • \r:替换符,将r之后的字符串逐一替换r之前的字符串。
  • \f:换页

字符串运算符

  • +:拼接字符串。
  • *:重复字符串。
  • []:获取字符串下标对应的字符。
  • [start:end]:截取字符串。
  • in:成员运算符,判断字符是否在字符串中。
  • not in
  • r/R:表示raw原始字符串,用于避免转义。
  • %:字符串格式化

字符串格式化实例:

1
2
print ("我叫%s今年%d岁!" % ('mason', 11))
# 我叫mason今年11岁
  • %c:格式化字符及其ASCII码
  • %s:格式化字符串
  • %d:格式化整数
  • %u:格式化无符号整型
  • %o:格式化无符号八进制数
  • %x:格式化无符号十六进制数
  • %X:格式化无符号十六进制数(大写)
  • %f:格式化浮点数字,可指定小数点后的精度
  • %e:用科学计数法格式化浮点数
  • %E:作用同%e,用科学计数法格式化浮点数
  • %g:%f和%e的简写
  • %G:%f和%E的简写
  • %p:用十六进制数格式化变量的地址

三引号

三引号可以让字符串跨多行。

f-string

f-string是新的格式化字符串的方法。

用法:

1
2
name = 'mason'
print(f'my name is {name}, and {10+10} years old')

3.8以上版本可以用=来拼接运算式和运算结果:

1
2
print(f'{1+2=}')
# 1+2=3

unicode字符串

用到的时候查表。

字符串函数

随用随查:https://www.runoob.com/python3/python3-string.html

参考文档

  1. https://www.runoob.com/python3/python3-tutorial.html

评论