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 中的 &&,||,!变成:andornot
- 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
 
    
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号