Python-1 基础学习笔记
学习资料参考:菜鸟教程,廖雪峰
基础
#!/usr/bin/python
文件顶部指定解释器的路径。可以让文件直接在Unix/Linux/Mac上运行。
- 这种指定指的是使用
./main.py
直接运行时。 - 而使用
python ./main.py
该行代码会被忽略。
- 默认以 utf-8 编码。自定义编码如下:
# -*- coding: cp-1252 -*-
- 标识符:
字母或下划线_
开头;整个由字母、数字和下划线组成
- python 3 以后可以使用非 ASCII 字符,即中文等作为变量名。
- 大小写敏感
- 注释
# 单行注释
"""
多行注释1
"""
'''
多行注释2
'''
- 使用三引号也可以包裹多行字符串
- 多行语句:
>>> print('''line1
... line2
... line3''')
line1
line2
line3
以上是命令行模式中,保存文件中的直接换行,不需要三个句号连接。
total = item_one + \
item_two + \
item_three
# 而有括号[]、()、{}的可不用反斜杠
total = ['item_one', 'item_two', 'item_three', 'item_four', 'item_five']
print("first",
"too long") # 这里貌似没有缩进要求
- 在一行中使用多条语句,使用
;
分隔。 - 代码块使用缩进表示,不要求缩进数量,但是要求同一代码块必须有相同的缩进。
- 函数之间、类之间使用空行间隔,比较具有可读性。非强制,但很推荐。
print()
中使用逗号分隔多个参数,会使前后两个字符中间自动添加空格。
- 它默认结尾换行,不换行:
print("结尾不换行", end="")
- 就是将结尾删除掉了,这里还可以将结尾换成任意字符
- 注意:
+
连接只能打印字符串类型,如果接上数字就会报错
first = 1
print("报错,无法打印" + first)
# TypeError: can only concatenate str (not "int") to str
- 布尔值:
True
,False
(注意大小写,值为1、0,可以进行运算) - java 中的
&&
,||
,!
变成:and
or
not
null
变成None
- Python 是动态语言,类型不固定,定义变量前不需要声明类型
a = 'ABC'
b = a
a = 'XYZ'
print(b)
结果:
ABC
- Python 中没有常量这一说法,都是可以被改变的。但也可以使用大写名称来表示是一个不应该被修改的量(我们思想上默认为常量~)
- 与 java 不同,Python 中,两个整数使用
/
进行除法运算,结果是浮点数,带小数点。
而//
,称地板除,则与 java 中的/
相似。整数相除只能得到整数结果。 - Python 的整数浮点数没有限制大小,但是太大了会表示为 inf(无限大)
- Python 中没有自增,里面的数字类型是不可变数据。
基本数据类型
赋值
- 为多个变量赋相同值:
a = b = c = 1
- 创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。
- 多个变量,各自赋值:(先计算右边,再赋值给左边,适合条件可以少写一个变量)
a, b, c = 1, 2, "runoob"
- 两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 "runoob" 分配给变量 c。
del
:解除变量的引用
del var1[,var2[,var3[....,varN]]]
总览
Python 3 中有六个标准的数据类型:
- Number(数字):不可改
- String(字符串):不可改
- List(列表):有序可重复
- Tuple(元组):有序可重复,不可改
- Set(集合):无序不可重复
- Dictionary(字典):无序不可重复,相当于 Map,
{"热":"流汗"}
Python 3 的六个标准数据类型中:
-
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
-
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
-
对于可变对象,对象的操作不会重建对象,而对于不可变对象,每一次操作就重建新的对象:
def listChanged(a): # 列表
a[0] = 2
a = [1]
listChanged(a)
print(a)
def numberChanged(a): # 字符串结果相同,内存地址不一样说明重新建立了对象
a = 2
a = 1
numberChanged(a)
print(a)
[2]
1
- 经过进一步测试,列表、元组在函数内外,他们的内存地址都是一致,说明是传递了内存地址;(除元组外都是可变类型)
而数字、字符串等函数内外内存地址不一样,说明重新创建了对象。(不可变类型) - 利用:因此可以利用不可变类型的参数来避免数据被某函数所改变。
查询变量类型
type()
函数可以用来查询变量所指的对象类型。不会显示为父类类型。isinstance(a, int)
:判断 a 是不是 int 类型。
- 因此可以使用
type()
精准判断类型。
type(123)==int
isinstance()
会认为子类是一种父类类型。
字符串
- python 中与 java 不同,没有字符,只有字符串,且字符串也是不可改变的。
+
与*
:
print("this " "is " "string") # 正常运行
this is string
print("this " * 2 + "is")
this this is
- 用
+
运算符连接字符串,用*
运算符重复。
ord('字符')
:获取字符的整数表示。chr(25591)
:获取数值的字符表示。- 将字符储存到文件时,需要转为字节,pyhton 中用
b'A'
表示字节,字符使用encode()
可以获得相应的字节。
'ABC'.encode('ascii') -> b'ABC'
'中文'.encode('utf-8') -> b'\xe4\xb8\xad\xe6\x96\x87'
- 注:中文无法使用 ascii 编码的(ascii 无法编码中文)。
- 反过来使用
decode('utf-8')
解码字节流。
- 如果包含无法解码的会报错,使用
ignore
忽略:
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
- 获取字符串长度:
len('计算我的字符长度')
- 如果是字节,则会计算字节数:
len(b'ABC')
# 得到3
len(b'\xe4\xb8\xad\xe6\x96\x87')
# 得到6
len('中文'.encode('utf-8'))
# 得到6
- 可见,一个英文通常占一个字节,一个中文占三个字节。
- 与
String.format()
相似,py 中是%
'Hello, %s' % 'world'
# 得到 'Hello, world'
'Hi, %s, you have $%d.' % ('Michael', 1000000)
# 得到 'Hi, Michael, you have $1000000.'
- 有多个参数时,使用小括号
%d
:整数
%f
: 浮点数
%s
:字符串
%x
:十六进制整数- 格式化整数和浮点数还可以指定是否补0和整数与小数的位数。
%%
表示%
字符。- 也可以将
%
换成.format()
,它是替换原文本中的{1}
,{2}
等。
r'\n不是换行'
:r
指 raw,即 raw string,自动转义字符串,使得里面的斜杠不具转义功能。这里使得\n
就是普通“反斜杠n”字符。f-string
格式化字符串:
str = f'其他字符{content:format}'
{}
里content
可以为变量、表达式也可以为函数,里面不能使用反斜杠转义,因为它是相当于一小段代码嘛。{}
添加冒号:
,为前面的最后计算得到的字符进行格式化。
对齐相关格式描述符
格式描述符 | 含义与作用 |
---|---|
< |
左对齐(字符串默认对齐方式),< 后面跟数字表示对齐字符距离,前面表示距离不够时填充的字符 |
> |
右对齐(数值默认对齐方式) |
^ |
居中 |
数字符号相关格式描述符
格式描述符 | 含义与作用 |
---|---|
+ |
负数前加负号(- ),正数前加正号(+ ) |
- |
负数前加负号(- ),正数前不加任何符号(默认) |
(空格) |
负数前加负号(- ),正数前加一个空格 |
注:仅适用于数值类型。
数字显示方式相关格式描述符
格式描述符 | 含义与作用 |
---|---|
# |
切换数字显示方式 |
宽度与精度相关格式描述符
格式描述符 | 含义与作用 |
---|---|
width |
整数 width 指定宽度,如 {a:10} |
0width |
整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度 |
width.precision |
整数 width 指定宽度,整数 precision 指定显示精度,如 {a:10.2} 表示保留两位精度 |
示例:
t = "天气不错"
s = 2.456
print(f'你说:{t},你有{s:.2f}块钱')
{t}
:替换为变量t
的值{s:.2f}
:替换为s
的值,并且保留两位小数
你说:天气不错,你有2.46块钱
常用的字符串函数
string.capitalize()
:首字母大写。str.strip([chars])
:去除首尾指定字符,默认空格或换行符。lstrip()
、rstrip()
:仅去除左右边的。string.decode(encoding='UTF-8', errors='strict')
:解码字符串,errors
是选择出错后的处理方式。
string.encode(encoding='UTF-8', errors='strict')
:编码字符串。string.endswith(obj, beg=0, end=len(string))
:是否以指定字符串结尾,范围可选。string.count(str, beg=0, end=len(string))
:返回str
出现的次数,范围可选。string.find(str, beg=0, end=len(string))
:返回str
出现的索引位置,不存在返回 -1,范围可选。string.index(str, beg=0, end=len(string))
:与find()
类似,但是不存在会抛出异常。string.isalnum()
、string.isalpha()
、string.isdecimal()
、string.isdigit()
、string.islower()
、string.isnumeric()
、string.isspace()
、string.istitle()
、string.isupper()
:判断字符串的组成。string.join(seq)
:以指定字符将序列拼接成字符串。- 元组、列表、字典、字符串,字典连接键。
string.split(str="", num=string.count(str))
:以指定字符拆成列表。可选指定次数。string.partition(str)
:以str
为界,拆分成三段,返回三元素的元组。不存在则只有一个元素,为整个字符串本身。string.replace(str1, str2, num=string.count(str1))
:将str1
换成str2
,可选指定替换次数。string.translate(str, del="")
:按照翻译表替换里面的字符。
from string import maketrans # 引用 maketrans 函数。
intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)
str = "this is string example....wow!!!";
print str.translate(trantab); # th3s 3s str3ng 2x1mpl2....w4w!!!
list:列表
L = ['Apple', 123, True]
- 有序可重复,相当于 java 的数组
- 可以用
L[-1]
获取末尾的元素,-2 倒二,-3 倒三 - 与字符串有很多相同操作,截取、
*
复制、+
连接。 - 通过
if 'Apple' in L
来看是否存在该元素。 L.append('末尾添加元素')
。L.insert(1, '插入')
:原来的元素和原来元素后面的元素一起后移一位。L.pop()
:删除末尾元素,(i)
:指定位置。- 与 java 规定不同,python 列表中的元素可以类型不同。
- 多维列表:列表里可以还有列表,且因类型可不同,还可以有普通的元素和列表在一起。
- 和字符串一样,可以使用运算符
+
和*
,突显 Python 的便利性。 (+
有顺序)。 del a[0]
根据索引删除一个值。
将列表当做堆栈使用
先进后出(后进先出):使用 list.append()
、list.pop()
。
将列表当作队列使用
先进先出(后进后出):使用 list.append()
、list.leftpop()
。
但是这样效率不高,每次 list.leftpop()
,列表剩余全部元素就会移动一下。
tuple:元组
t = (1, 2)
t = 1, 2
- 也是有序可重复的,但是无法被修改,没有 insert 等方法。
- 注意:
t = (1)
表示的是t = 1
,不是元组,小括号这里是计算符号。
- 使用
t = (1, )
消除歧义。 - 使用
t = ()
创建空元组。
- 注意:无法被修改指的是,元组里储存各个元素的内存地址不变,如果里面有一个列表,那么这个列表的内容是可以更改的。
set:集合
结构与 list 相似,但是是无序的不可重复的,底层与 dict 相似,都是要计算 key 获取位置。但是 set 不是键值对,跟 list 一样只储存一个值。
- 无序,不可重复的一种列表
s = set([1, 2, 2, 3])
s = {1, 2, 3}
- 创建,是将 list 转为 set,重复元素会被自动过滤
- 创建空集合:
set([])
{}
是创建空字典
- 创建空集合:
add()
,remove()
- 集合的运算
print(a - b) # a 和 b 的差集
print(a | b) # a 和 b 的并集
print(a & b) # a 和 b 的交集
print(a ^ b) # a 和 b 中不同时存在的元素
ps:集合与数学中的集合相似,。。。已经有点忘了高中的知识了。【互异性,无序性】
互异性,无序性:数学集合_百度百科
集合常用方法
添加元素
setx.add(string|tuple|bool|number):void # 添加元素
setx.update(y [,z...]):void # 添加元素,类型需为有子元素的 list|tuple|dict
setx.clear():void # 清空集合
setx.copy():set # 深拷贝(指向新的内存地址)
删除元素
setx.remove(y):void|KeyError # 如删除不存在的元素,有报错
setx.discard(y):void # 删除集合中指定的元素,不会报错
setx.pop():mixed # 随机删除集合元素,并返回被删除的元素
右全包含布尔真:判断 setx 集合的所有元素是否都包含在 sety 集合中
setx.issubset(sety):bool
>>> x = {"a", "b", "c"}
>>> y = {"f", "e", "d", "c", "b", "a"}
>>> x.issubset(y) True
左全包含布尔真: 判断 sety 集合的所有元素是否都包含在原始 setx 的集合中
setx.issuperset(sety):bool >>> x = {"a", "b", "c"} >>> y = {"f", "e", "d", "c", "b", "a"} >>> y.issuperset(x) True
右半包含布尔取反:判断集合 sety 中是否有集合 setx 的任一元素(包含返回 False,不包含返回 True)
setx.isdisjoint(sety):bool
合并集合(并集):(注意:集合元素的去重、唯一性)
setx.union(sety [, setz...]):set
>>> x = {"a", "b", "c"}
>>> y = {"f", "d", "a"}
>>> z = {"c", "d", "e"}
>>> x.union(y, z)
{'c', 'd', 'f', 'e', 'b', 'a'}
左包含差集: 返回集合的差集,即返回的集合元素包含在第一个集合 x 中,但不包含在第二个集合 y(方法的参数)中
setx.difference(sety):set
左引用删除交集(无返回值,即直接修改原内存指向)
setx.difference_update(sety):void
>>> x,y
({'banana', 'cshit', 'vipkwd.com', 'alipay'}, {'google', 'runoob', 'facebook', 'alipay'})
>>> type(x.difference_update(y))
<class 'NoneType'>
>>> x,y
({'banana', 'cshit', 'vipkwd.com'}, {'google', 'runoob', 'facebook', 'alipay'})
左右差集:返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素
setx.symmetric_difference(sety):set
左引用删除交集且引用追加右差集(引用操作,无返回值)
setx.symmetric_difference_update(sett):void
左右交集:返回两个或更多集合中都包含的元素,即交集
setx.intersection(sety[, seyz....]):set
左引用交集
setx.intersection_update(sety):void
辅助理解:所有提到 “引用” 俩字的都是函数内部直接操作内存指向,故无返回值。
dict dictionary 字典
相当于 java 中的 map
。
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
95
d = dict(Runoob=1, Google=2, Taobao=3) # 只能这种形式,直接变量不行
print(d)
d = dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
print(d)
- 与 HashMap 相似,是通过 key 计算储存位置的,所以储存读取速度比较快。但是占用内存大。
- key 是不可变的(需要它的 hash 值,而变量内容不同则 hash 应不同),因此 list 不能作为 key。
- 因为是计算 key确定储存位置的,所以 key 是唯一的,想“新增”也都会变成“修改”。
- 通过
if 'Thomas' in d
来看是否存在该 key。 - 不存在的情况:
d.get('Anny')
返回'None'
;d.get('Anny', -1)
返回自己给的默认值 -1。
pop('Bob')
:删除指定 key 和和该 key 下的 value。- 有关迭代,见另一笔记
变量类型转换
函数 | 描述 |
---|---|
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) | 将一个整数转换为一个八进制字符串 |
条件语句
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
- 使用缩进区分代码块
- 冒号不可忘:
elif :
- 简写:
if x:
print('True')
只要 x
是非零数值、非空字符串、非空 list 等,就判断为 True
,否则为 False
。
4. 使用 int('4')
将字符串转为数值
循环语句
- java 中的增强 for 循环,
:
变成in
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
Michael
Bob
Tracy
list(range(5))
[0, 1, 2, 3, 4]
range(5)
:生成 0-4 的整数list()
:转化为列表
- while 循环,相似。
break
打断,continue
跳到下一个循环。
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
运算符
Python算术运算符
**
:次方,几次幂。2**3
值为 8
。
//
:取整除。向下取接近商的整数。9//2
得 4
。
Python比较运算符
Python赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
**= |
幂赋值运算符 | c **= a 等效于 c = c ** a 【注意是有顺序的!列表的计算就有用】 |
//= |
取整除赋值运算符 | c //= a 等效于 c = c // a |
:= |
海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符。 | 见下方 |
海象运算符:在这个示例中,赋值表达式可以避免调用 len()
两次:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
- 省略我们中间赋值的步骤
while (block := f.read(256)) != '':
process(block)
把运算符后面的表达式赋值给变量,然后将这个变量拿来使用,作为判断的条件。
Python位运算符:&
|
^
~
<<
>>
Python逻辑运算符:and
、or
、not
Python成员运算符
in
:如果在指定的序列中找到值返回 True,否则返回 False。(字符串,列表,元组)
not in
Python身份运算符
is
:判断两个标识符是不是引用自一个对象。(类似 id(x) == id(y)
)
is not
变量作用域
TODO
UnboundLocalError: local variable 'count' referenced before assignment