Python 学习笔记6

Python 学习笔记

集合的操作

set.add()用来向后添加

set1.update(set2)将set2加入到set1中,但是添加的位置是无序的

set.remove(obj)删除已存在的元素,不存在会报错

set.discard(obj)删除元素,如果不存在的话不会做任何操作

set.pop()随机删除其中的一个元素


更多的操作方式如下图所示


函数

格式

def 函数名([参数]):
    ...
    ...

isinstance(变量,类型名)判断所给变量的类型是否符合

参数位置可以使用给定的默认参数,与C++相同的是默认值参数必须放在后面

关键字赋值:当想不按参数顺序给参数赋值时,可以使用关键字赋值,如

def test(a,b):
    print(a,b)
 
test(1,2)  # 位置参数
# 1 2
test(b=1,a=2)  # 关键字参数
# 2 1 
test(b=1,2)  # 关键字参数写在位置参数之前会导致出错

注意:关键字参数写在位置参数之前会导致出错,必须写在位置参数之后,参数名必须和函数参数名相同


可变参数*args

本质上就是通过拆包与装包,能够实现接受不定数量的参数,装包成一个数组,使用时即可使用args[i]的形式

但是要注意的是,如果传递的参数是一个列表/元组,装包操作会把这一个列表/元组封装成只含一个元素的元组,此时按原来的调用方式就会出错

此时如果想传入这类参数,那么可以使用function(*list)的形式,将列表进行拆包,在函数调用时再解包


关键字参数**kwargs

和可变参数相似,关键字参数是将一个不定长度的关键字参数转化为字典,即

def show(**kwargs):
    print(kwargs)
show(a=1,b=2,c=3)

此时键似乎只能使用符号,而且默认作为字符串,不需要加上引号,而值需要加上

注意: 同时使用*args**kwargs时,*args参数必须要列在**kwargs前,否则会报错。


返回值

和C++相同,使用return语句返回,但是可以返回多个值,返回值会形成一个元组


局部变量和全局变量

和C++基本相同

但是发现函数内全局变量无法进行如a-=1的修改,要解决这种情况,可以使用global a认定a为全局变量,然后可以进行修改

关于global关键字的添加,只有不可变类型的才需要加global关键字,可变类型的不需要加就可使用全局变量

可变类型:list,dict,set

不可变类型: 其余的所有

本质上不是内容变不变,而是看在更改其内容的时候,相应的内存地址有没有发生变化


函数注释

可以在函数的第一行写入字符串,或者使用''' '''来唤起自动的函数参数注释模板,当使用help(function)时可以打印出此内容


引用与函数参数传递

和C++相比,C++分为值传递和引用传递,而在python中,就我个人理解,函数参数传递时本质上都是相同的赋值操作,一开始参数的地址都与实参地址相同,而后对于更改内容的操作时,分为可变参数和不可变参数,从而起到了类似值传递和引用传递的效果

在sys库中可以使用sys.getrefcount(a)来查看当前变量引用数目(由于函数调用也传递了一次所以会多一个)


闭包

locals()可以以字典的形式返回作用域内的全部局部变量

对于函数内部,也可以定义函数,称之为内部函数,类似于函数和全局之间的关系,而变量也有类似的关系,想要在内部函数中使用外部函数定义的变量,可以使用nolocal关键字来表明

注意: 当内层已经定义了一个同名的变量后,不能再用global或者nolocal关键字,否则会导致冲突

函数的检索顺序: 内层函数->外层函数->全局函数->系统函数

需要注意的是,函数的返回值不仅能是一个值,而且还可以是一个函数名(本质上是函数的地址),从而能够在外部使用内部函数

闭包的格式:

  1. 有嵌套函数
  2. 内部函数引用了外部函数的变量
  3. 外部函数的返回值时内部函数(不是值!)

装饰器

用于不改变内层函数并增加功能,语法如下

def decorater(func):
    def wrapper():
        func()
        print(wrapper)
    return wrapper


@decorater
def f1():
    print(f1)

当调用f1()时,@decorater作用相当于f1=decorater(f1),而decorater内部又返回了wrapper函数,也就是将f1=wrapper(),起到了对f1的装饰作用

带参数函数的装饰

如果原函数带有参数,那么装饰的内部函数也需要用参数,同时考虑到装饰器的普适性,装饰器的参数一般使用*args,*kwargs

带返回值的装饰器

内部函数也要有返回值
返回值由装饰器内部函数的返回值确定

装饰器带参数

def outer_check(time):
    def check_time(action):
        def do_action():
            if time < 22:
                return action()
            else:
                return '对不起,您不具有该权限'
        return do_action
    return check_time

@outer_check(23)
def play_game():
    return '玩儿游戏'

print(play_game())

通过多层函数,一层一层进行装饰,内层函数可以使用外层参数

递归函数

和C++相同

匿名函数

用lambda关键词能创建小型函数。这种函数得名于省略了用def声明函数的标准步骤。

lambda 参数列表: 运算表达式
posted @ 2022-06-27 16:03  源小枔儿  阅读(27)  评论(0编辑  收藏  举报