函数

目录

    1.什么是函数
    具备某一功能的工具=>函数
    工具的使用:
    实现准备好的工具
    =>函数定义
    遇到应用场景拿来就用
    >函数的调用
    2.为什么要有函数
    1.程序的组织结构不清晰,可读性差
    2.如果要用到重复的功能,只能拷贝功能的实现代码=>代码冗余
    3.可扩展性差
    3.如何用函数
    函数的使用原则:先定义,后调用

    定义函数:
    	def 函数名(参数1,参数2,....):
    	"""文档注释"""
    	代码1
    	代码2
    	代码3
    	...
    	return 返回值
    调用函数:
    	函数名(值1,值2,....)
    

    一.函数的基本使用
    1.定义函数:申请内存空间把函数体代码保存下来,然后把内存地址绑定给函数名=>函数名=函数的内存地址

    def func():
    	print("*"*10)
    	print("hello")
    	print("*"*10)
    print(func)
    

    2.调用函数:函数名()=>函数的内存地址(),会触发函数体代码的运行
    func()
    二,定义函数的三种格式
    2.1:无参函数

    def login():
    	inp_name = input("your name:).strip()
    	inp_pwd = input("your pwd:).strip()
    	if inp_name == 'egon' and inp_pwd == '123':
    		print('login successful')
    	else:
    		print('login error')
    login()
    

    2.2,有参函数

    def max1(x,y)
    	if x > y:
    		print(x)
    	else:
    		print(y)
    max1(1,2)
    

    2.3空函数

    def func()
    	pass
    

    三.函数的调用
    return:
    函数内可以有多个return,但只要执行一次函数就会立刻结束,
    并把return后的值当做本次调用的结果返回.
    函数可以有三种形式的返回值
    1.return 值:返回的就是指本身
    2.return 值1,值2,值3: 返回的是一个元祖
    3.没有return: 默认返回的是None

    三.函数的调用
    return:
    函数内可以有多个return,但只要执行一次函数就会立刻结束,
    并把return后的值当做本次调用的结果返回.
    函数可以有三种形式的返回值
    1.return 值:返回的就是指本身
    2.return 值1,值2,值3: 返回的是一个元祖
    3.没有return: 默认返回的是None

    def max2(x,y):
    	if x > y:
    		return x
    	else:
    		return y
    
    res = max2(1,2)
    print(res*12)
    

    四,函数调用的三种格式
    4.1语句形式:单纯的调用一下函数就完了

    def sayhi(s,n):
        # s = '-'
        # n = 20
        print(s*n)
        print('hello')
        print(s*n)
    
    sayhi('*',30)
    

    4.2表达式形式

    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    res=max2(11,22) * 12
    print(res)
    

    4.3可以把函数的调用当做值传给宁外一个函数
    print(max2(11,22))

    总结:
    函数的使用一定要分两个阶段去看:
    1,定义阶段:只检测语法,不执行代码
    2,调用阶段:执行函数体代码
    如果发生语法错误 ,定义阶段就会立马检测出来

    def func():
    	print('hello
    

    如果发生的不是语法错误,而是逻辑错误,只能在调用阶段检测到:

    如果发生的不是语法错误,而是逻辑错误,只能在调用阶段检测到:

    def func():
    	xxx
    func()
    
    示范1:
    def bar():
        print('from bar')
    
    def foo():
        print('from foo')
        bar()
    
    foo()
    示范2:
    def foo():
        print('from foo')
        bar()
    
    def bar():
        print('from bar')
    
    
    foo()
    

    一, 函数的参数分为两大类:
    1, 形参: 在定义函数是, 括号内定义的变量名, 称之为形式参数, 简称形参 = > 变量名

    def func(x, y):
    	x = 1
    	y = 2
    
    
    print(x)
    print(y)
    

    2, 实参: 在调用函数是, 括号内传入的值, 称之为实际参数, 简称实参 = > 变量值
    func(1, 2)

    二: 在python中参数的种类
    1, 位置参数:
    位置参数: 在函数定义阶段按照从左到右的顺序依次定义形参(变量名), 称之为位置形参
    特点: 必须被传值

    def func(x, y):
    	print(x, y)
    
    func(1, 2)
    func(1)  # 少一个不行
    func(1, 2, 3)  # 多一个也不行
    

    2, 位置实参: 在函数调用阶段按照从左到右的顺序依次定义实参(传入的变量值), 称之为位置实参
    特点: 按照位置传值, 一一对应
    func(1, 2, 3, 4, 5, 6)

    3, 关键字实参: 在函数调用阶段按照key:value的形式为指定的形参名传值, 该形式称之为关键字实参
    特点: 在传值时可以完全打乱顺序, 但是任然能够指名道姓的为指定形参传值

    def func(name, age):
    	print(name, age)
    
    
    func("egon", 17)
    func(age=17, name="egon")
    

    注意: 可以混用位置实参与关键字实参
    但是1, 位置实参必须放在关键字实参前面
    2, 不能为同一个形参赋值

    def func(name, age, salary):
    	print(name)
    	print(age)
    	print(salary)
    
    
    func('egon', salary=3.1, age=18)
    func('egon', salary=3.1, 18)  # 错误
    func('egon', 18, salary=3.1)  # 错误
    
    func('egon', 18, age=19, salary=3.3)
    

    默认形参: 在函数定义阶段就已经为某个形参赋值, 该形参称之为有默认值的形参, 简称默认形参
    特点: 定义阶段就已经被赋值意味着在函数调用阶段可以不用为其赋值

    def func(x, y=2):
    	print(x, y)
    
    
    func(1)
    func(1, 222)
    

    注意:
    1, 默认形参应该放在位置形参后面

    def func(y=2, x):
    	pass  # 错误
    

    默认形参的值通常应该是不可变类型

    # def func(name,hobby,hobbies=[]):
    
    #     hobbies.append(hobby)
    
    #     print("%s 的爱好是:%s" %(name,hobbies))
    
    #
    
    # func("egon",'play')
    
    # func('lili','music')
    
    # func("jack",'read')
    
    def func(name, hobby, hobbies=None):
    	if hobbies is None:
    		hobbies = []
    	hobbies.append(hobby)
    	print("%s 的爱好是:%s" % (name, hobbies))
    
    
    func("egon", 'play')
    func('lili', 'music')
    func("jack", 'read')
    

    3.默认形参的值只在函数定义阶段被赋值依次,函数定义之后的改变对默认形参没有影响

    m=333
    def func(x,y=m): # y=333
        print(x,y)
    
    m=44444
    func(1)
    
    def register(name,age,gender='male'):
        print(name)
        print(age)
        print(gender)
    
    register('egon',18,)
    register('jack',20,)
    register('tom',21,)
    register('lili',18,'female')
    
    原文地址:https://www.cnblogs.com/lgh8023/p/13332791.html