python学习历程(1)

最近也是大二了,好不容易终于接到了大创了,不过大创需要我们去深入学习python,加上打算去参加一个python的项目制作,再去想想我那python水平,简直一言难尽,只能抓紧时间赶快补了😱

这里就简单记录一下一些我没有什么印象的或者感觉比较重要的知识点。

一、python参数中的一些特殊参数

首先就需要先去了解一下什么是位置参数和关键字参数分别是什么。

1
2
3
4
5
def standard_arg(arg):
print(arg)

standard_arg(123) //位置参数,多个参数需要注意排序位置
standard_arg(arg=21) //关键字参数

函数定义中未使用 /* 时,参数可以按位置或关键字传递给函数。

1、仅位置参数

仅限位置时,形参的顺序很重要,并且这些参数在传参时必须使用位置参数传参

仅限位置形参应放在 / (正斜杠)前。/ 用于在逻辑上分割仅限位置形参与其它形参。如果函数定义中没有 /,则表示没有仅限位置形参

2、仅关键词参数

把形参标记为 仅限关键字,表明必须以关键字参数形式传递该形参,应在参数列表中第一个 仅限关键字 形参前添加 *

3、实例

请看下面的函数定义示例,注意 /* 标记:

>>>

1
2
3
4
5
6
7
8
9
10
11
>>> def standard_arg(arg):
... print(arg)
...
>>> def pos_only_arg(arg, /):
... print(arg)
...
>>> def kwd_only_arg(*, arg):
... print(arg)
...
>>> def combined_example(pos_only, /, standard, *, kwd_only):
... print(pos_only, standard, kwd_only)

第一个函数定义 standard_arg 是最常见的形式,对调用方式没有任何限制,可以按位置也可以按关键字传递参数:

>>>

1
2
3
4
5
>>> standard_arg(2)
2

>>> standard_arg(arg=2)
2

第二个函数 pos_only_arg 的函数定义中有 /,仅限使用位置形参:

>>>

1
2
3
4
5
6
7
>>> pos_only_arg(1)
1

>>> pos_only_arg(arg=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg'

第三个函数 kwd_only_args 的函数定义通过 * 表明仅限关键字参数:

>>>

1
2
3
4
5
6
7
>>> kwd_only_arg(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given

>>> kwd_only_arg(arg=3)
3

最后一个函数在同一个函数定义中,使用了全部三种调用惯例:

>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> combined_example(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: combined_example() takes 2 positional arguments but 3 were given

>>> combined_example(1, 2, kwd_only=3)
1 2 3

>>> combined_example(1, standard=2, kwd_only=3)
1 2 3

>>> combined_example(pos_only=1, standard=2, kwd_only=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only'

下面的函数定义中,kwdsname 当作键,因此,可能与位置参数 name 产生潜在冲突:

1
2
def foo(name, **kwds):
return 'name' in kwds

调用该函数不可能返回 True,因为关键字 'name' 总与第一个形参绑定。例如:

>>>

1
2
3
4
5
>>> foo(1, **{'name': 2})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for argument 'name'
>>>

加上 / (仅限位置参数)后,就可以了。此时,函数定义把 name 当作位置参数,'name' 也可以作为关键字参数的键:

>>>

1
2
3
4
5
>>> def foo(name, /, **kwds):
... return 'name' in kwds
...
>>> foo(1, **{'name': 2})
True

换句话说,仅限位置形参的名称可以在 **kwds 中使用,而不产生歧义。

取自python官方文档

二、装饰器

可以通过修饰去简化代码并且达到相应的目的。

1、装饰器雏形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def guanjia(game):
def inner():
print("打开外挂")
game()
print("关闭外挂")
return inner


def play_dnf():
print("你好啊!我叫赛利亚,今天又是美好的一天!")



@guanjia
def play_lol():
print("欢迎来到英雄联盟")

play_lol()

这就是一个简单的装饰器,通过这种方法就能使我们更方便的对函数进行相关的加装以及优化,

2、装饰器的简单应用

在一些程序应用当中,我们会需要利用到登入的操作,这个时候我们就会想要实现,去实现什么功能之前需要先登入,这个时候装饰器就有用武之地了。不多说,直接看个小案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
login_flag = False


def login_verify(fn):
def inner(*args, **kwargs):
global login_flag
if login_flag:
return fn(*args, **kwargs)
else:
print('请先登录')
print('还未完成用户登录操作')
while 1:
username = input('请输入用户名:')
password = input('请输入密码:')
if username == 'admin' and password == '123456':
print('登录成功')
login_flag = True
break
else:
print('用户名或密码错误,请重新输入')
ret = fn(*args, **kwargs)
return ret
return inner

@login_verify
def index():
print('欢迎来到首页')


@login_verify
def order():
print('欢迎来到我的订单')


@login_verify
def profile():
print('欢迎来到我的资料')

index()
order()
profile()

之后的相应是

1
2
3
4
5
6
7
8
9
PS C:\VScodeproject> & C:/Users/ASUS/AppData/Local/Programs/Python/Python310/python.exe c:/VScodeproject/python/python-study/装饰器应用.py
请先登录
还未完成用户登录操作
请输入用户名:admin
请输入密码:123456
登录成功
欢迎来到首页
欢迎来到我的订单
欢迎来到我的资料

三、Pickle和Json模块的总结

Pickle是将对象(数据)转化为字节,json是将对象(数据)转化为json格式

1、dumps 把对象(数据)转化为字节

2、loads 把字节转化回对象(数据)

3、dump 把对象序列化成字节之后写入到文件

3、load 把文件中的字节反序列化成对象