夜阑卧听风吹雨

铁马冰河入梦来

Loading

Python-1 基础学习笔记

学习资料参考:菜鸟教程,廖雪峰

基础

  1. #!/usr/bin/python 文件顶部指定解释器的路径。可以让文件直接在Unix/Linux/Mac上运行。
  • 这种指定指的是使用 ./main.py 直接运行时。
  • 而使用 python ./main.py 该行代码会被忽略。
  1. 默认以 utf-8 编码。自定义编码如下:
# -*- coding: cp-1252 -*-
  1. 标识符:
    字母或下划线 _ 开头;整个由字母、数字和下划线组成
  • python 3 以后可以使用非 ASCII 字符,即中文等作为变量名。
  • 大小写敏感
  1. 注释
# 单行注释

"""
多行注释1
"""

'''
多行注释2
'''
  • 使用三引号也可以包裹多行字符串
  1. 多行语句:
>>> 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") # 这里貌似没有缩进要求
  1. 在一行中使用多条语句,使用 ; 分隔。
  2. 代码块使用缩进表示,不要求缩进数量,但是要求同一代码块必须有相同的缩进。
  3. 函数之间、类之间使用空行间隔,比较具有可读性。非强制,但很推荐。
  4. print() 中使用逗号分隔多个参数,会使前后两个字符中间自动添加空格
  • 它默认结尾换行,不换行:print("结尾不换行", end="")
  • 就是将结尾删除掉了,这里还可以将结尾换成任意字符
  • 注意+ 连接只能打印字符串类型,如果接上数字就会报错
first = 1
print("报错,无法打印" + first)
# TypeError: can only concatenate str (not "int") to str
  1. 布尔值:TrueFalse注意大小写,值为1、0,可以进行运算)
  2. java 中的 &&||! 变成:and or not
  3. null 变成 None
  4. Python 是动态语言,类型不固定,定义变量前不需要声明类型
a = 'ABC'
b = a
a = 'XYZ'
print(b)

结果:

ABC
  1. Python 中没有常量这一说法,都是可以被改变的。但也可以使用大写名称来表示是一个不应该被修改的量(我们思想上默认为常量~)
  2. 与 java 不同,Python 中,两个整数使用 / 进行除法运算,结果是浮点数,带小数点。
    //,称地板除,则与 java 中的 / 相似。整数相除只能得到整数结果。
  3. Python 的整数浮点数没有限制大小,但是太大了会表示为 inf(无限大)
  4. Python 中没有自增,里面的数字类型是不可变数据

基本数据类型

赋值

  1. 为多个变量赋相同值:
a = b = c =  1
  • 创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。
  1. 多个变量,各自赋值:(先计算右边,再赋值给左边,适合条件可以少写一个变量)
a, b, c =  1,  2,  "runoob"
  • 两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 "runoob" 分配给变量 c。
  1. 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() 会认为子类是一种父类类型。

字符串

  1. python 中与 java 不同,没有字符,只有字符串,且字符串也是不可改变的。
  2. +*
print("this " "is " "string") # 正常运行

this is string

print("this "  *  2  + "is")

this this is

  • + 运算符连接字符串,用 * 运算符重复。
  1. ord('字符'):获取字符的整数表示。
  2. chr(25591):获取数值的字符表示。
  3. 将字符储存到文件时,需要转为字节,pyhton 中用 b'A' 表示字节,字符使用 encode() 可以获得相应的字节。
'ABC'.encode('ascii') -> b'ABC'
'中文'.encode('utf-8') -> b'\xe4\xb8\xad\xe6\x96\x87'
  • 注:中文无法使用 ascii 编码的(ascii 无法编码中文)。
  1. 反过来使用 decode('utf-8') 解码字节流。
  • 如果包含无法解码的会报错,使用 ignore 忽略:
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
  1. 获取字符串长度:
len('计算我的字符长度')
  • 如果是字节,则会计算字节数:
len(b'ABC')
# 得到3
len(b'\xe4\xb8\xad\xe6\x96\x87')
# 得到6
len('中文'.encode('utf-8'))
# 得到6
  • 可见,一个英文通常占一个字节,一个中文占三个字节。
  1. 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} 等。
  1. r'\n不是换行'r 指 raw,即 raw string,自动转义字符串,使得里面的斜杠不具转义功能。这里使得 \n 就是普通“反斜杠n”字符。
  2. f-string 格式化字符串:
str = f'其他字符{content:format}'
  • {}content 可以为变量、表达式也可以为函数,里面不能使用反斜杠转义,因为它是相当于一小段代码嘛。
  • {} 添加冒号 :,为前面的最后计算得到的字符进行格式化。

有关于格式化写法:Python格式化字符串f-string概览_sunxb10的博客-CSDN博客

对齐相关格式描述符

格式描述符 含义与作用
< 左对齐(字符串默认对齐方式),< 后面跟数字表示对齐字符距离,前面表示距离不够时填充的字符
> 右对齐(数值默认对齐方式)
^ 居中

数字符号相关格式描述符

格式描述符 含义与作用
+ 负数前加负号(-),正数前加正号(+
- 负数前加负号(-),正数前不加任何符号(默认)
(空格) 负数前加负号(-),正数前加一个空格

注:仅适用于数值类型。

数字显示方式相关格式描述符

格式描述符 含义与作用
# 切换数字显示方式

宽度与精度相关格式描述符

格式描述符 含义与作用
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]
  1. 有序可重复,相当于 java 的数组
  2. 可以用 L[-1] 获取末尾的元素,-2 倒二,-3 倒三
  3. 与字符串有很多相同操作,截取、* 复制、+ 连接。
  4. 通过 if 'Apple' in L 来看是否存在该元素。
  5. L.append('末尾添加元素')
  6. L.insert(1, '插入'):原来的元素和原来元素后面的元素一起后移一位。
  7. L.pop():删除末尾元素,(i):指定位置。
  8. 与 java 规定不同,python 列表中的元素可以类型不同。
  9. 多维列表:列表里可以还有列表,且因类型可不同,还可以有普通的元素和列表在一起。
  10. 和字符串一样,可以使用运算符 +*,突显 Python 的便利性。 (+ 有顺序)。
  11. del a[0] 根据索引删除一个值。

将列表当做堆栈使用

先进后出(后进先出):使用 list.append()list.pop()

将列表当作队列使用

先进先出(后进后出):使用 list.append()list.leftpop()
但是这样效率不高,每次 list.leftpop(),列表剩余全部元素就会移动一下。

tuple:元组

t = (1, 2)
t = 1, 2
  1. 也是有序可重复的,但是无法被修改,没有 insert 等方法。
  2. 注意t = (1) 表示的是 t = 1,不是元组,小括号这里是计算符号。
  • 使用 t = (1, ) 消除歧义。
  • 使用 t = () 创建空元组。
  1. 注意:无法被修改指的是,元组里储存各个元素的内存地址不变,如果里面有一个列表,那么这个列表的内容是可以更改的。

set:集合

结构与 list 相似,但是是无序不可重复的,底层与 dict 相似,都是要计算 key 获取位置。但是 set 不是键值对,跟 list 一样只储存一个值。

  • 无序,不可重复的一种列表
s = set([1, 2, 2, 3])
s = {1, 2, 3}

  1. 创建,是将 list 转为 set,重复元素会被自动过滤
    • 创建空集合:set([])
    • {} 是创建空字典
  2. add()remove()
  3. 集合的运算
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)

  1. 与 HashMap 相似,是通过 key 计算储存位置的,所以储存读取速度比较快。但是占用内存大。
  • key 是不可变的(需要它的 hash 值,而变量内容不同则 hash 应不同),因此 list 不能作为 key。
  • 因为是计算 key确定储存位置的,所以 key 是唯一的,想“新增”也都会变成“修改”。
  1. 通过 if 'Thomas' in d 来看是否存在该 key。
  2. 不存在的情况:d.get('Anny') 返回 'None'
    • d.get('Anny', -1) 返回自己给的默认值 -1。
  3. pop('Bob'):删除指定 key 和和该 key 下的 value。
  4. 有关迭代,见另一笔记

变量类型转换

函数 描述
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')
  1. 使用缩进区分代码块
  2. 冒号不可忘:elif :
  3. 简写:
if x:
    print('True')

只要 x非零数值、非空字符串、非空 list 等,就判断为 True,否则为 False
4. 使用 int('4') 将字符串转为数值

循环语句

  1. 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():转化为列表
  1. while 循环,相似。
  • break 打断,continue 跳到下一个循环。
sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

运算符

Python算术运算符

**:次方,几次幂。2**3 值为 8
//:取整除。向下取接近商的整数。9//24

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逻辑运算符:andornot

Python成员运算符

in:如果在指定的序列中找到值返回 True,否则返回 False。(字符串,列表,元组)
not in

Python身份运算符

is:判断两个标识符是不是引用自一个对象。(类似 id(x) == id(y)
is not

变量作用域

TODO
UnboundLocalError: local variable 'count' referenced before assignment

posted @ 2020-12-04 21:29  二次蓝  阅读(94)  评论(0编辑  收藏  举报