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)

其他参数类型:

  1. 变长参数:前缀加*
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)
  1. 可变关键字参数,前缀用**表示,实际上就是传进去一堆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)

星号运算符的其他用法

  1. 赋值语句中作为可变长变量标志
>>> 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.....

posted @ 2021-08-20 21:18  王冰冰  阅读(69)  评论(0编辑  收藏  举报