zoukankan      html  css  js  c++  java
  • python ---------函数

    一、为什么要使用函数?

      因为如果没有函数我们平时的代码就会有很多重复

      避免代码重用

      提升代码的可读性

    二、函数的定义与调用:

      

    1def  函数名(参数1,参数2)

        ''' 函数注释'''

        print('函数体')

        return 返回值

    函数就是封装一个功能

    定义:

      def 关键字开头,空格之后接函数名和圆括号,最后加一个冒号

      def是固定的不能改变

    函数名的定义和变量一样 :数字字母下划线 任意组合 ,不能是数字开头  不能是关键字  要具有可描述性

    函数的调用

    返回值=函数名(参数1,参数2)#记得函数名后面加括号

    下面我们先来定义一个求计算字符串长度的函数。假如我们的len()函数现在不能用了,那么我们就需要定义一个函数,求字符串的长度。如果让我们一次一次的去写相同的代码,会显得很麻烦。这时候我们的函数就上场了。

    def length():
        s= 'hello world'
        length = 0
        for i in s :
            length +=1
        print(length)
    print(length())    #因为没有返回值你打印最后会显示一个null
    def length():
        s= 'bjbbabjsaofsa'
        num = 0
        for i in s:
            num +=1
        return num   
    m = length()
    print(m)
    # print(length())#return的时候你可以定义一个变量来接收 也可以不接收直接打印 但是如果print就不可以 但是一般最好不要在函数中写print太lowle 
    View Code

    函数的返回值:

    定义函数一般不要在函数中写print

    return

    1、在函数中遇到return就结束函数

    2、将值返还给函数的调用者

      无return

        return None

      return一个值该值是什么就返还什么

    大家看一下对与函数中只能存在一个return 因为第一个碰到return就把函数结束了

    >>> def func(a, b ,c):
        return a
        return b
    
    >>> print(func(3, 7, 8))
    3     #只返回第一个return的3  因为碰到第一个return就把函数结束了 其他的return 存在的没有意义了
    >>> 

      

    函数的传递参数:

      两个方面:

      实参角度:

      1形式参数和实际参数

      

    def my_len(a): #这个a就是形式参数 用来接收实际参数的
        return l
    print(my_len(3))  #实际参数 实实在在存在的
    View Code

      2位置传参 一  一对应

      

    def func(a, b ,c):
        return a, b, c
    print(func(2, 3,700))   #一一对应并且是当作一个元组打印出来

      3、混合传参----->关键字永远在最后面

      

    def func(a, b=30 ,c): #形式参数和实际参数的一样都是直接赋值的要放在最后不然会报错,这个你看b直接赋值了但是放在了中间就报错
        return a, b, c,
    print(func(2, 3,b=700))

      

    def func(a, c ,b=40):
        return a, b, c  #这个就是对的  就是全部都放在后面
    print(func(2, 3,b=700))

    如果你return的好几个值都在一起return那么最后的返回值显示出来就在一个元组内

    3,函数名可以作为函数的参数。
    def func():
    pass
    def func1(a):
    a()
    func1(func)
    4,函数名可以作为函数的返回值。
    def func1(a):
    return a
    func1(func)()

    默认传参:

    def Info(username,sex=''):  #定义一个默认参数  sex
        with open('one',encoding= 'UTF-8',mode = 'a')as f :  #a就是追加内容
            f.write('{}	{}
    '.format(username,sex))
    while True :
        username= input('输入您的姓名:(男生为1开头)').strip()
        if '1' in username :
            username =username[1:]
            Info(username)
        else :
            Info(username,sex='')
    View Code

     函数的动态参数:

    因为我们的静态参数只能接收固定的  不能接收哪些不确定的或者多余的变量

    动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。

    按位置传值多余的参数都由args统一接收,保存成一个元组的形式       

    按照关键字传值接收多个关键字参数由kwargs接收 保存成一个字典的形式

    # def Func(a,*args,b=''):
    #     print(a)
    #     print(b)
    #     print(*args)
    # Func(3,2,3,4,b='')
    
    # def n (a,b,c,**kwargs):
    #     print(kwargs)
    #
    # n(1,2,3,d=5,f=6)
    # def func(*args):
    #     print(args) #(1,2,30,1,2,33.。。。。。)
    # l1 = [1,2,30]
    # l2= [1,2,33,21,45,66]
    # func()
    # def Func(*args):
    #     print(args)
    #
    #
    # li={'name':1,'age':5}
    # l1 = [1,2,30]
    # l2= [1,2,33,21,45,66]
    # Func(*li)
    # def Nu(a,b,*args,sex='麻痹'):
    #     print(args)
    #     print(sex)
    # Nu(3,6,'pfapifuafjfbsa',sex='弄哈')
    # def N():
    #     print(a,*args,**kwargs)
    #     print(args)
    #     # print(kwargs)
    #     print(kwargs)
    #
    #
    # N(1,'2345',b=12)
    #*agrs  动态参数  万能参数
    
    #args 动态参数 接收的就是实参对应的 所有位置参数 并将其放在元组中
    #位置参数  *args 默认参数
    # def func (a,b,c,*args,e=''):
    #     print(a)
    #     print(b)
    #     print(c)
    #     print(args)
    #     print(e)
    # func(1,2,3,4,5,6,e='')
    #**kwargs
    # def func(a, b,c, d, *args, e='',**kwargs):
    #     print(a)
    #     print(b)
    #     print(c)
    #     print(d)
    #     print(args)
    #     print(kwargs)
    # func(1,2,3,4,5,m=9)
    
    # 最终顺序:位置参数,*args 默认参数 **kwargs
    # def func(a,b,c,e='laowang',*args):
    #     print(a)
    #     print(b)
    #     print(c)
    #     print(e)
    #     print(args)
    # func(1,2,3,4,7,8,89)  #如果默认参数放在args之前那么传值就会把args给传递给默认参数一个 把它给覆盖了 所以一般不这样做
    
    # *的魔法运用
    # def func(*args):
    #     print(args)
    #
    # # l =[1,2,3]
    # # l2=[1,2,3,4,5,6]
    # l=(1,2,3,4)
    # l2=(2,3,4,5)
    # func(*l,*l2)  #*号可以把两个列表元组给传递进函数内 然后转化位一个元组中 因为*args接收完 那么用args输出后就会把所有的元素都放在元组中
    
    # def func(*args):
    #     print(args)
    #
    # l = [1,23,4,56,78]
    # l1=[1,2,3,4]
    # a={'name':'alex','age':12}
    # func(*a)  #如果是字典运用*号然后再把字典让args接收的话就会把字典中的key值给放在元组中打印出来
    # func(*l,*l1) # *星号可以放列表  字符串  元组 字典(字典只是显示key值),int类型是不可以放进去的
    # def func(**kwargs):
    #     print(kwargs)
    # dic ={'name1':'alex','age1':47}
    # dic1={'name':'old_man','age':56}
    # func(**dic,**dic1)
    
    #单个的*可以接收不同的列表、元组、字符串内的相同的元素 因为它可以把相同的元素 变成同一个,而**两个星号不可以接收两个人不同的字典内的相同的key就是用**组合两个字典 这两个字典内不可以出现相同的key
    
    #在函数的定义时, *rags、**kwargs# 代表的是聚合
    # def func(*args,**kwargs):
    #     print(args)
    #     print(kwargs)
    # dic1 = {'name1':'alex','age1':46}
    # dic2 = {'name':'老男孩','age':56}
    # func(*[1,2,3,4],*'jkbabl',**dic1,**dic2)   *和 **可以同时使用的
    #
    
    # def func(*args,**kwargs):
    #     print(args)
    #     print(kwargs)
    #
    # dic1 = {'name1':'alex','age1':46}
    # dic2 = {'name':'老男孩','age':56}
    # func(*[1,2,3,4],*'bjbfbabfa',**dic1,**dic2) #字符串如果打散放入args中就会以单独的字符串类型的形式放入进去
    View Code

    *args必须放在默认参数之前放在位置参数之后 ,**kwargs必须放在最后 也就和静态参数一样 默认参数都在最后 而**kwargs接收的是赋值的默认参数 所以必须放在最后

     

     

    
    
    
  • 相关阅读:
    linux 程序后台运行
    小型网站架构技术点(简要)
    rsync安装与配置使用 数据同步方案(centos6.5)
    nfs的原理 安装配置方法 centos6.5
    centos 6.5 升级到 python2.7
    ntpdate 设置时区(注意本地时区要设置正确)
    关于umask的计算方式(简单任性)
    No space left on device(总结)
    lsof 查看打开了一个文件的有哪些进程 统计那个进程打开的文件最多
    作用域是什么?
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/8665112.html
Copyright © 2011-2022 走看看