Python第三天-函数

解构赋值

a, b, c = [1, 2, 3]  # 列表解构
print(a, b, c)
a, b, c = (1, 2, 3,)  # 元组解构
print(a, b, c)
a, b, c = {1, 2, 3}  # 集合解构
print(a, b, c)
a, b, c = range(1, 4)  # 范围解构
print(a, b, c)
a, b, c = "hel"  # 字符串解构
print(a, b, c)
a, b = {"name": "lisi", "age": 34}  # 字典解构
print(a, b)

将可迭代对象依次赋值给左边变量

函数定义

def my_sum(num1, num2):
    '''
    calculate two num sum
    :param num1:
    :param num2:
    :return:
    '''
    return num1 + num2


print(my_sum(2, 5))  # 位置对应
print(my_sum(num2=5, num1=2))  # 参数名称对应
print(my_sum(3, num2=8))  # 混合

使用def关键字声明函数,3引号声明函数文档注释,没有return语句会返回None,多个返回值会包装成元组。实参和形参必须一一对应,不能多也不能少。位置对应必须在名称对应之前。

默认参数

def my_sum(num1, num2, num3=0):
    '''
    calculate three num sum
    :param num1: 
    :param num2: 
    :param num3: 
    :return: 
    '''
    return num1 + num2 + num3


print(my_sum(6, 5))
print(my_sum(6, 5, 2))

默认参数在声明函数时定义,传参使用参数值,不传使用默认值。默认参数必须为不可变对象。

可变参数

def my_sum(*nums):
    sum = 0
    for num in nums:
        sum += num
    return sum


print(my_sum(1, 2, 3, 4, 6))  # 可变参数
print(my_sum(*[1, 2, 3, 4, 5]))  # 解构赋值

python会将多个参数包装成元组传递给函数。

关键字参数

def person(name, age, **kwargs):
    return {"name": name, "age": age, **kwargs}

print(person("lisi", 23, city="shanghai", job="java"))
print(person(**{"name": "lisi", "age": 23, "city": "shanghai", "job": "java"}))  # 解构赋值

python会将多个关键字参数包装成字典传递给函数。

局部变量和全局变量

NAME = "lisi"  # 全局变量
AGE = 23  # 全局变量

def change_name():
    global NAME  # 关联全局变量
    NAME = "lisi2"  # 修改全局变量
    AGE = 34  # 局部变量
    print(NAME, AGE)

change_name()

print(NAME, AGE)

使用global修改全局变量,先找局部变量,找不到再找全局变量。

NAME = "lisi"  # 全局变量

def change_name():
    NAME = "xioaming" 

    def change_name2():
        nonlocal NAME  #关联上一级作用域变量
        NAME = "xioali" # 修改
        print(NAME)

    change_name2()
    print(NAME)

change_name()
print(NAME)

使用nonlocal修改上一级作用域变量

递归函数

def my_sum(*nums):
    if len(nums) == 0:
        return 0
    return my_sum(*nums[0:-1]) + nums[-1]


print(my_sum(1, 2, 3, 6))
print(my_sum(1))
print(my_sum())

递归就是直接或间接的调用自己。

闭包

def create_counter(num=0):
    def inc():
        nonlocal num
        num += 1
        return num

    return inc


counter = create_counter()
print(counter())  # 1
print(counter())  # 2
counter = create_counter(5)
print(counter())  # 6
print(counter())  # 7

python中,只有函数内部或函数内部的子函数才可以读取或修改局部变量,闭包就是可以读取其他函数内部变量的函数,简单理解为函数内部的函数,它是将函数内部和函数外部连接的桥梁。

lambda函数

my_sum = lambda x, y: x + y
print(my_sum(3, 4))

python的lambda函数的函数体只能是表达式,不能是多条语句。

内置函数

print(abs(-12))  # 求绝对值
print(min(3, 5, 7, -3, 4))  # 最小值
print(max(4, 5, 6, 7))  # 最大值
print(sum([1, 2, 3], 0))  # 求和
print(pow(3, 2))  # 求幂次方
print(round(3.4568, 2))  # 四舍五入
print(divmod(9, 2))  # 求商和余数
print(int("123"))  # 转为int类型
print(float("123"))  # 转为float类型
print(bool("1"))  # 转为bool类型 0或空为False
print(bin(123))  # 转为2进制字符串
print(oct(123))  # 转为8进制字符串
print(hex(123))  # 转为16进制字符串
print(ord("A"))  # 获取对应的10进制整数
print(chr(65))  # 获取对应的字符
print(eval('2**3'))  # 执行python语句
exec('print(2**3)')  # 执行python语句

f = open("test.txt", "r")  # 打开文件
print(f.readlines())

print(str([1, 2, 3]))  # 转为字符串形式


class Person():
    pass


p = Person()
setattr(p, "len", 4)  # 设置属性值
print(getattr(p, "len"))  # 获取属性值
print(hasattr(p, "len"))  # 是否包含属性
delattr(p, "len")  # 删除属性
print(all([1, 2, 3, 0]))  # 可迭代对象是否全部为True
print(any([1, 2, 3, 0]))  # 可迭代对象是否有一个为True
print(dir())  # 获取当前模块的属性列表
it = iter([1, 2, 3])  # 获取列表的迭代器对象
while True:
    try:
        print(next(it))  # 获取迭代器的下一个对象,没有抛出异常
    except StopIteration:
        break
sli = slice(0, 2, 1)  # 创建切片对象
print([1, 2, 3, 4, 5][sli])
print(id("lisi"))  # 获取对象的内存地址
print(sorted([1, 3, 6, 4]))  # 对可迭代对象排序
print(list(reversed([1, 3, 6, 4])))  # 翻转可迭代对象
print(ascii([1, 2, 3]))  # 获取对象的字符串表示
for (i, v) in enumerate(["lisi", "zhangsan"]):  # 获取可迭代对象的索引序列,包含索引和数据
    print(i, v)
print(isinstance("", (str, list)))  # 对象是否为类的实例
print(issubclass(bool, int))  # 是否为父类


class Father:
    def sing(self):
        print("father sing")


class Child(Father):
    def sing(self):
        super().sing()  # 调用父类方法
        print("child sing")


print(Child().sing())
print(bytearray("lisi", encoding="utf-8"))  # 创建字节数组
print(bytes("lisi", encoding="utf-8"))  # 创建不可变字节数组
print(dict(name="lisi", age=23))  # 创建一个字典
print(tuple([1, 2, 3]))  # 创建元组
print(list((1, 2, 3,)))  # 创建列表
print(set([1, 2, 3]))  # 创建集合
print(frozenset([1, 2, 3]))  # 创建不可变集合
print(range(5))  # 创建范围对象
print(list(filter(lambda x: len(x) >= 4, ["java", "go", "python"])))  # 过滤可迭代对象
print("abc")  # 打印输出函数
print(callable(Child))  # 是否是可调用的
print("name:{name},age:{age}".format(name="lisi", age=23))  # 字符串格式化
print(len("hello"))  # 获取对象长度
print(type(""))  # 获取对象类型
print(vars(p))  # 获取对象的属性
print(hash("abxc"))  # 获取对象的哈希值
print(list(map(lambda x: x ** 2, [1, 2, 3])))  # 映射
print(list(zip([1, 2, 3], [4, 5, 6])))  # 将可迭代对象打包成元组
print(help('str'))  # 查看函数或模块的详细信息
print(input("please input num: "))  # 接受标准输入
原文地址:https://www.cnblogs.com/strongmore/p/13545290.html