最近也是大二了,好不容易终于接到了大创了,不过大创需要我们去深入学习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'
下面的函数定义中,kwds
把 name
当作键,因此,可能与位置参数 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 把文件中的字节反序列化成对象