Python学习笔记
本文用于记录Python学习过程中的笔记,因为不常使用python,每次想写py都得先查半天百度,这里记录一下,顺便正经学一学,不然每次想写都费半天劲。
先来一点无关内容,vscode的python插件智能提示很慢的话,把Language Server改成Pylance
,不要用Jedi
。来源:vscode写python的自动提示功能太慢,如何改善? - 真的很厉害的回答 - 知乎
函数
函数的定义
def add(arg1: str, arg2: int, arg3 = 100):
pass
# 或者不指明函数参数的类型也可以
def add(arg1, arg2, arg3 = 100):
pass
可以用add.__annotations__
获取函数的参数类型,上述第一种写法就是添加了__annotations__
信息。详见:不知道python函数参数的类型怎么办? - 知乎
调用函数的办法:
add("1",2)
add("1",arg2=2)
其他参数类型:
- 变长参数:前缀加*
def add(*args0, arg2: int, arg3 = 100):
pass
add(1,2,3,4,arg2=5)
args0的类型实际上是元组,里面的元素可以有任意个。上述调用中,args0 = (1,2,3,4)
,arg2必须用参数名字传参(想想也知道肯定的)。如果实参是一个元组或者列表,想把它解包成n个元素传进去,可以在实参前加*,如下例:
def add(*args0): #函数接收n个参数,并且会被打包成一个元组传进来
pass
par = (1,2,3,4)
add(*par) #这样就把par解包后传进去,等价于 add(1,2,3,4)
- 可变关键字参数,前缀用**表示,实际上就是传进去一堆key-value对。参数被保存为字典类型
def add(**args):
for key, value in args.items():
print("%s=%s" % (key, value))
add(a=1,b=2,c=3)
上述会输出
a=1
b=2
c=3
这种传参万万不可传进去一个字典对象,也就是下面这种写法是错的:
par = {
'a' : 1,
'b' : 2,
'c' : 3
}
add(par)
但是,可以在实参前加**将字典解包传进去,如下例:
def add(**kwargs):
pass
add(**par) # 等价于add(a=1,b=2,c=3)
星号运算符的其他用法
- 赋值语句中作为可变长变量标志
>>> a, *b = range(5)
>>> a,b
(0, [1, 2, 3, 4])
>>> *a, b = range(5)
>>> a, b
([0, 1, 2, 3], 4)
当星号出现在赋值符号左边时,必须保证有一个非星号变量,否则,星号的出现没有意义,会报错。
2. 在除函数参数语境外的其他语境下对可迭代对象进行解包
在python3.5之后,可以在元组、列表、集合和字典内部进行对可迭代参数直接解包,注意,必须是这四种内部。
a=*range(3),
b=*range(3),3
c=[*range(3)]
d={*range(3)}
e={**{'y':1}}
print(a) # output: (0,1,2)
print(b) # output: (0,1,2,3)
print(c) # output: [0,1,2]
print(d) # output: {0,1,2}
print(e) # output: {'y':1}
一些错误的写法:
a = *range(5) # 右边不是tuple、list、set、dict的任何之一内部
此部分引用自:Python星号表达式(*)用法详解_S_o_l_o_n的博客-CSDN博客_python星号表达式
元组和列表
元组初始化后就是只读的,列表是可以更改的。
元组用圆括号,列表用方括号。
a = (1,2,3) #元组
b= [1,2] # 列表
常用方法:
- len(list) len(tuple)
- list.append(param)
其他方法就百度搜索吧
字典
dict = {
'Name': 'Zara',
'Age': 7,
'Class': 'First'
}
访问dict中的元素,没有该key则会抛出异常:
a = dict['Name']
a = dict['grade'] # 抛出异常
给dict中的元素赋值,有则改之,无则添加
dict['Name'] = 'Bob' # 修改Name项
dict['grade'] = 100 # 添加新项
删除一个键:
del dict['Name']
删除整个字典
del dict
for in
字典遍历:
默认遍历key
dic = {'a': 1, 'b': 2}
for key in dic:
print(key)
遍历key和value
for k,v in dic.items():
print(k,v)
range
# 输出 [0,10)
for i in range(10):
print(i)
# 输出[10,20)
for i in range(10,20):
print(i)
用for in快速生成list
a = [i for i in range(1, 11)]
a = [i*2 for i in range(1, 11)]
a = [str(i) for i in range(1, 11)]
a = [i for i in range(1, 11) if i % 2 == 0]
异常处理
try:
pass
except ErrorType1:
pass
except ErrorType2:
pass
except ErrorType3 as e:
pass
except:
pass
else:
pass #未发生异常则执行该分支
finally:
pass # 无论是否异常都执行该分支
恶心人的import
太麻烦了,困死了,贴两个链接有空再研究
面试官一个小时逼疯面试者》之聊聊Python Import System? - 没有50CM手臂的文章 - 知乎
Python中import的用法 - 门书生的文章 - 知乎
常用函数技巧(未完待续)
字符串转数字
https://www.cnblogs.com/wuxiangli/p/6046800.html
int(x [,base ]) # 将字符串x转换为一个整数
字符串格式化
python基础_格式化输出(%用法和format用法) - Penphy - 博客园
'this is {0} and {1} with {0}'.format('ok','nok')
'this is %d and %s with %d' % (1,'age',200)
enumerate函数
同时获得列表的数据元素和下表
a = ['a','c','b']
for i, v in enumerate(a):
print('i = {0} v = {1}'.format(i, v))
# 输出结果:
i = 0 v = a
i = 1 v = c
i = 2 v = b
a = ['a','c','b']
print(list(enumerate(a)))
# 输出结果:
[(0, 'a'), (1, 'c'), (2, 'b')]
time函数:
详见:https://www.runoob.com/note/28072
各种骚操作
函数有个__doc__
属性,是字符串,叫docString,就是函数的注释。
装饰器:用@开头的类和方法。详见:
https://www.runoob.com/w3cnote/python-func-decorators.html
最近发现个查各种文档的好软件:Zeal,用qt写的。macos有dash,但是无windows版。
dash官网:https://kapeli.com/dash
zeal官网:https://zealdocs.org
能查python、pandas、sql.....