zoukankan      html  css  js  c++  java
  • Python学习函数

    一、函数及使用函数的目的

    函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行这个函数,只需调用其函数名即可。

    使用函数目的:

    1、简化代码
    2、提高代码的复用性
    3、代码可扩展

    二、定义函数

    在Python中定义函数要使用def关键字,依次写出函数名、括号、参数和冒号(:),然后在缩进块中编写函数体

    def say(): #函数名
        print('hello')#函数体

    上面只是定义了一个函数,不调用函数,函数是不会被执行的

    say()  #调用函数

    三、函数的参数

    定义函数时就确定了参数名字和位置。调用函数,只需知道如何传递正确的参数,以及函数将返回什么样的值。函数内部的复杂逻辑被封装起来,调用者无需知道。

    函数在调用的时候,可以传入参数,有形参和实参:

    1、形参:形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。形参只在函数内部有效。

    2、实参:实参可以是常量、变量、表达式、函数等,无论实参是何种类型,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

    总结来说就是,形参就是函数接收的参数,而实参就是实际传入的参数。

    #函数的参数
    def calc(a,b):  #a,b为形参, 形式参数
        res = a * b
        print('%s * %s = %s'%(a,b,res))
    
    calc(7,8)  #调用函数,7,8即为实参,实际参数

    函数的4中形式参数:

    1)位置参数

    上面例子中的a,b即为位置参数,是必传的;调用函数的时候,有几个位置参数就要传几个,不然就要报错。

    如图,调用上面的函数,只传一个参数,报错:

    calc(7)

    2)默认参数

    默认参数是指定义形参时,给参数设定一个默认值。

    默认参数不是必填;给默认参数传值,它就会使用你传入的值。若使用默认值参数,则必须放在位置参数后面,否则会报错

    默认参数可以简化函数代码,能降低调用函数的难度

    举例如下:不传内容时则为读文件,传了content则写文件

    def op_file(file_name,conent=None):    #content默认值参数,它是非必填的
        f = open(file_name,'a+',encoding='utf-8')
        f.seek(0)
        if conent:#不为空代表写文件
            f.write(conent)
            f.flush()
        else:
            all_users = f.read()
            return all_users  #调用完函数之后,返回什么结果
        f.close()
    res = op_file('a.txt') #不传默认值参数,读文件
    print(res)
    op_file('a.txt','写入内容') #指定默认值参数的值,写文件

    非固定参数:位置参数、默认参数的参数个数都是固定的。当函数参数不固定时,需要用非固定参数,非固定参数包含:可变参数、关键字参数。

    3)可变参数

    可变参数用*来接收,可变参数就是传入的参数个数是可变的,想传多少个参数就传多少个;这些可变参数在函数调用时自动组装为一个tuple。

    如果位置参数、默认值参数、可变参数一起使用的的话,可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的。

    def get_info(name,age=18,*args):  #可变参数,可变参数会把后面多传的参数都放到args这个元组中
        print(name,age,args)
    
    #调用
    get_info('Lucy','white','red','blue')
    get_info('Lucy')  #不传可变参数

    结果:

    4)关键字参数

    关键字参数使用**来接收,参数也不固定的,想传多少个参数就传多少个;这些关键字参数在函数内部自动组装为一个dict。

    使用关键字参数,调用的时候必须使用关键字传参,关键字参数也是非必传的。

    可以和上面的几种一起来使用,一起使用时关键字参数必须在最后面。

    def my(name,sex='',*args,**kwargs): #位置参数、默认参数、可变参数、关键字参数
        print(name,sex,args,kwargs)      #关键字参数,调用的时候会把传入的关键字参数放到kwargs这个字典中
    
    my('xhei',)
    my('xhei','hhh','args','args2',k='1',k2='v2')  #调用,k,k2就是关键字参数
    my(name='hahah',sex='',age=18)

    输出结果:

    四、函数的返回值

    在Python中,当函数里面没有指定返回值,函数执行完之后,默认会返回一个None。

    当函数有多个返回值时,会把返回值都放到一个元组中,返回的是一个元组。

    函数中的返回值使用return,函数遇到return就立即结束。

    def haha():
        #函数里面遇到return函数就立即结束了
        for i in range(5):
            print(i)
            if i==3:
                return  #只写一个return的话,就返回None
    res = haha()
    print(res)

    结果:

    五、局部变量、全局变量

    局部变量:在函数里面定义的变量都是局部变量,出了函数之后就不能用了

    全局变量:在文件最上面定义的这个变量,就是全局变量。在函数中要修改全局变量的话,需要加global关键字声明;如果是list、字典和集合的话,则不需要加global直接可修改

    name = '小黑' #全局变量
    FILE_NAME = 'goods.json' #常量
    def demo():
        global name  #修改全局变量,需要加global
        name='小白'
        print(name)
    demo()
    print('修改后的name:',name)

    查看结果:

    #字典、list和集合,这种可变变量,不需要用global来声明,就可直接修改该
    d = {'name':'abc'}
    def test():
        d['sex'] = 29
        print(d)
    test()
    print(d)

    六、递归函数

    在函数内部,可以调用其他的函数。当一个函数在内部调用自身本身时,这个函数就是递归函数。

    #判断是否为偶数
    def my2():
        num = input('输入一个数字:')
        num = int(num)
        if num%2 !=0:
            print('请输入偶数')
            return my2() 1#不是偶数的话继续调用自己
    my2()
    # 递归:函数自己调用自己
    count = 1  #统计最多循环的次数,超出最大次数就报错
    def add():
        global count
        count +=1
        print('hhh',count)
        add()
    add()

    递归函数的特性:

    1、定义简单,逻辑清晰

    2、使用递归必须有一个明确的结束条件

    3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    4、递归最多循环999次

    七、内置函数

    print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真
    print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真
    print(bin(10))#十进制转二进制
    print(bool('s'))#把一个对象转换成布尔类型
    print(bytearray('abcde',encoding='utf-8'))#把字符串变成一个可修改的bytes
    print(callable('aa'))#判断传入的对象是否可调用
    print(chr(10))#打印数字对应的ascii
    print(ord('b'))#打印字符串对应的ascii码
    print(dict(a=1,b=2))#转换字典
    print(dir(1))#打印传入对象的可调用方法
    print(eval('[]'))#执行python代码,只能执行简单的,定义数据类型和运算
    print(exec('def a():pass'))#执行python代码
    print(filter(lambda x:x>5,[12,3,12,2,1,2,35]))#把后面的迭代对象根据前面的方法筛选
    print(map(lambda x:x>5,[1,2,3,4,5,6]))
    print(frozenset({1,2,3,3}))#定义一个不可修改的集合
    print(globals())#返回程序内所有的变量,返回的是一个字典
    print(locals())#返回局部变量
    print(hash('aaa'))#把一个字符串哈希成一个数字
    print(hex(111))#数字转成16进制
    print(max(111,12))#取最大值
    print(oct(111))#把数字转换成8进制
    print(round(11.11,2))#取几位小数
    print(sorted([2,31,34,6,1,23,4]))#排序
    dic={1:2,3:4,5:6,7:8}
    print(sorted(dic.items()))#按照字典的key排序
    print(sorted(dic.items(),key=lambda x:x[1]))#按照字典的value排序
    __import__('decorator')#导入一个模块
    print(max(111,12))#取最大值
    print(min((1,2,3)))#取最小值
    print(abs(-1))#取绝对值
    print(round(11.119999,3)) #取几位小数
    print(sorted([2,31,34,6,1,23,4])) #排序
    print(sorted([2,31,34,6,1,23,4],reverse=True)) #降序排
  • 相关阅读:
    NET Core 2.2
    NET Core项目模板
    Eclipse同时显示多个控制台项目的输出
    Java中的序列化
    Java中的泛型
    Java中的集合
    Java中的数据结构
    Java中的包
    Java中的接口
    Java中的封装
  • 原文地址:https://www.cnblogs.com/ddxxn/p/9303628.html
Copyright © 2011-2022 走看看