zoukankan      html  css  js  c++  java
  • 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: "))  # 接受标准输入
    
  • 相关阅读:
    关于BigDecimal转String的准确性问题
    MyBatis动态Sql之if标签的注意事项
    Servlet与通信协议概述
    关于ThreadLocal的那些事
    MyBatis 中 @Param 注解的四种使用场景
    Mybatis中#{}与${}的区别
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    jsp有哪些动作?作用分别是什么?
    forward 和redirect的区别 ?
    Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
  • 原文地址:https://www.cnblogs.com/strongmore/p/13545290.html
Copyright © 2011-2022 走看看