zoukankan      html  css  js  c++  java
  • 函数

    什么是函数

    ​ 在程序中,函数就是具备某一功能的工具,事先将工具准备好就是函数的定义,遇到应用场景拿来就用就是函数的调用。

    为何要用函数

    如果不使用函数,写程序时将会遇到这三个问题:

    1. 程序冗长
    2. 程序的扩展性差
    3. 程序的可读性差

    如何用函数

    先定义函数,后调用

    • 定义函数
    def 函数名(param1、param2……):
        """
        函数功能的描述信息
        :param1:描述
        :param2:描述
        :return:返回值
        """
        code 1
        code 2
        code 3
        ...
    
        return 返回值
    
    • 调用函数
    函数名(param1、param2……)
    

    注册功能函数

    # 注册功能函数
    def register():
        """注册功能"""
        username = input('username: ').strip()
        pwd = input('password: ').strip()
    
        with open('38a.txt', 'a', encoding='utf8') as fa:
            fa.write(f"{username}:{pwd}
    ")
            fa.flush()
    
    
    register()
    # 复用
    register()
    register()
    

    登录功能函数

    # 登录功能函数
    def login():
        """登录功能"""
        inp_username = input('username: ').strip()
        inp_pwd = input('password: ').strip()
    
        with open('38a.txt', 'rt', encoding='utf8') as fr:
            for user_info in fr:
                user_info = user_info.strip('
    ')
                user_info_list = user_info.split(':')
                if inp_username == user_info_list[0] and inp_pwd == user_info_list[1]:
                    print('login successful')
                    break
            else:
                print('failed')
    
    
    login()
    
    

    函数定义阶段

    定义完函数之后运行程序,只有语法错误才会报错

    def func():
        bar()  # 不属于语法错误,不会报错
        fun=   #报错,属于语法错误
        print('*'*10)
    

    定义函数的三种方式

    1. 无参函数

    定义函数时参数是函数体接收外部传值的一种媒介,其实就是一个变量名

    在函数阶段括号内没有参数,称为无参函数。需要注意的是:定义时无参,意味着调用时也无需传入参数。

    如果函数体代码逻辑不需要依赖外部传入的值,必须得定义成无参函数

    def func():
        print('hello nick')
        
    func()  # hello nick
    

    2. 有参函数

    在函数定义阶段括号内有参数,称为有参函数。需要注意的是:定义时有参,意味着调用时也必须传入参数。

    如果函数体代码逻辑需要依赖外部传入的值,必须得定义成有参函数。

    def sum_self(x, y):
        """求和"""
        res = x+y
        print(res)
    
    sum_self(1,2)  # 3
    

    3. 空函数

    当你只知道你需要实现某个功能,但不知道该如何用代码实现时,你可以暂时写个空函数,然后先实现其他的功能。

    def func():
    	pass
    

    函数的返回值

    是函数内部代码经过一系列逻辑处理获得的结果

    为什么要有返回值?

    如果需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须要有返回值。

    需要注意的是:

    • return是一个函数结束的标志,函数内可以有多个return,只要执行到return,函数就会停止。
    • return的返回值可以返回任意数据类型
    • return的返回值无个数限制,即可以使用逗号隔开返回多个值
      • 0个:返回None
      • 1个:返回值是该值本身
      • 多个:返回值是元组

    函数的调用

    什么是函数的调用?

    函数名(…) 即调用函数,会执行函数体代码,直到碰到return或者执行完函数体内所有代码结束。

    函数运行完毕所有代码,如果函数体不写return,则会返回None。

    调用函数来执行函数的功能

    函数调用的三种形式

    def max_self(x,y):
        if x>y:
            return x
        else:
            return y
        
    # 1.
    max_self(1,2)
    # 2.
    res = max_self(1,2)*12
    # 3.
    max_self(max_self(20000,30000),40000)
    

    函数参数的应用

    形参和实参

    1. 形参:

    在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名。

    1. 实参:

    在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值。

    位置参数

    在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。

    特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

    位置实参

    在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。

    特点:按照位置为对应的形参依次传值。

    关键字实参

    在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参。

    特点:可以打破位置的限制,但仍能为指定的形参赋值。

    注意:可以混用位置实参和关键字参数,但不能对一个形参重复赋值

    func(x, y=2)
    func(y=2, x)  # SyntaxError: positional argument follows keyword argument
    func(x, x=1)  # NameError: name 'x' is not defined
    

    默认形参

    在定义阶段,就已经被赋值

    特点:在定义阶段就已经被赋值,意味着在调用时可以不用为其赋值。

    注意:

    1. 位置形参必须放在默认形参的左边。
    2. 默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了。
    m = 10
    def foo(x=m):
        print(x)
    m = 111
    foo()  # 10
    
    1. 默认参数的值通常是不可变类型
    # 演示形参是可变类型
    def register(name, hobby, hobby_list=[]):
        hobby_list.append(hobby)
        print(f"{name} prefer {hobby}'")
        print(f"{name} prefer {hobby_list}")
    
    
    register('nick', 'read')
    register('tank', 'zuipao')
    register('jason', 'piao')
    
    nick prefer read'
    nick prefer ['read']
    tank prefer zuipao'
    tank prefer ['read', 'zuipao']
    jason prefer piao'
    jason prefer ['read', 'zuipao', 'piao']
    
    # 修改形参是可变类型代码
    def register(name, hobby, hobby_list=None):
        if hobby_list is None:
            hobby_list = []
        hobby_list.append(hobby)
        print(f"{name} prefer {hobby}'")
        print(f"{name} prefer {hobby_list}")
    
    register('nick', 'read')
    register('tank', 'zuipao')
    register('jason', 'piao')
    
    nick prefer read'
    nick prefer ['read']
    tank prefer zuipao'
    tank prefer ['zuipao']
    jason prefer piao'
    jason prefer ['piao']
    

    可变长参数

    指的是在调用函数时,传入的参数个数可以不固定

    调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**)

    可变长形参之*

    形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗成为args。

    ef sum_self(*args):
        res = 0
        for num in args:
            res += num
        return res
    
    
    res = sum_self(1, 2, 3, 4)
    print(res)  #10
    

    可变长实参之*

    实参中的会将后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带的,它就是位置实参,应该马上打散成位置实参去看。

    def func(x, y, z, *args):
        print(x, y, z, args)
    
    
    func(1, *(1, 2), 3, 4)
    
    1 1 2 (3,4)
    

    可变长形参之**

    形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

    def func(**kwargw):
        print(kwargw)
    
    
    func(a=5)
    
    {'a':5}
    

    可变长实参之**

    实参中的**,**会将**后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。

    def func(x, y, z, **kwargs):
        print(x, y, z, kwargs)
    
    
    func(1, 3, 4, **{'a': 1, 'b': 2})
    #1 3  4 {'a': 1, 'b': 2}
    

    可变长参数应用

    def index(name, age, sex):
        print(f"name: {name}, age: {age}, sex: {sex}")
    
    
    def wrapper(*args, **kwargs):
        print(f"args: {args}")
        print(f"kwargs: {kwargs}")
        index(*args, **kwargs)
    
    
    wrapper(name='nick', sex='male', age=19)
    
    args: ()
    kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
    name: nick, age: 19, sex: male
    
  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/zhoajiahao/p/10946357.html
Copyright © 2011-2022 走看看