zoukankan      html  css  js  c++  java
  • 函数

    函数基础

    一.定义

    不用函数的危害

    1.逻辑机构不好

    2.代码冗余

    3.代码可维护性差

    二.分类

    1.内置函数

    2.自定义函数

    def 函数名(arg1,arg2...):

      '描述信息'

      函数体

      return 1

    #先定义,后使用

    三.有参函数,无参函数和空函数

    1.无参函数

    def foo():

      'foo funciton'

      print('from the foo')

    #定义时无参,调用时无参

    #无参函数不需要返回值,通常内部都是语句,只是执行语句,没有运行结果

    2.有参函数

    def bar(x,y):
    print(x)
    print(y)
    print('from bar')
    res=x+y
    return res
    z=bar(1,2)
    print(z)
    #函数的调用
    #定义时有参,调用时有参
    foo() #语句形式
    res=bar(1,2) #表达式形式
    res2=bar(bar(1,2),3)
    有参函数一般要通过计算得到结果,通过return 赋值变量得到结果

    x=len('hello')
    print(x)
    print(len('aaaa'))

    3.空函数

    def auth():
    '认证'
    pass
    def list_goods():
    '商品列表'
    pass
    def buy():
    '购买'
    pass
    def interactive():
    '与用户交互'
    list_goods()
    money=input(">> ")
    goods=input(">> ")
    buy(money,goods)


    4.返回值


    1.特点


    函数的返回值没有类型限制,可以是任意类型
    没有return---->返回none
    return一个值----->1
    return1,2,3----->(1,2,3) 元组
    2.三种形式:

    def my_max(x,y):
    res=x if x > y else y #三元表达式
    return res
    res1=my_max(1,2)
    print(res1)
    返回一个

    返回多个def bar(x,y):

    return 1,2,3,[1,2],{'a':2},

    res2=bar(1,2)
    print(res2)
    ##返回元组形式了
    ##python里看到,默认翻译成元组形式

    3.多个return
    如果存在多个return返回值,return返回值只能返回一个(只能执行一次return)


    5.变量解压c

    x='hello'

    a,*_,e=[1,2,3,4,5]
    head,*_=[1,2,3,4,5] 只要开头的

    6.形参和实参

    1.定义

    函数的参数:
    def for(x,y)
    定义阶段:形参----->本质就是变量名
    定义变量名

    调用阶段:实参 --> 必须有一个明确的值
    变量值

    2.实参

    实参分三种格式

    1. 按位置传递

    #在实参的角度

    def foo(x,y)
    第一种:按照位置传值
    foo(1,2)

    第二种:按照关键字传值
    foo(x=1,y=2)

    第三种:混着用
    foo(1,y=2) ##按位置传值必须在按关键字传值的前面
    foo(y=2,1) 报错
    foo(1,x=1,y=2) 报错 ##对一个形参只能赋值一次

    3.形参

    位置参数:

    必须传值的参数def foo(x,y):


    print(x)

    print(y)

    foo(1,2)
    foo(y=2,x=1)

    #默认参数

     y=1   sex=male


    def foo(x,y=1):
    print(x)
    print(y)
    foo(1)
    打印出俩1
    foo(1,2)
    foo(y=2,x=1)

    一般把变化比较小的值定义成默认参数

    #默认参数必须放到位置参数的后面
    def register(sex='male',name): #报错
    print(name)
    print(sex)

    应该是

    def register(name,sex='male'):
    print(name)
    print(sex)

    register('liming')

    liming
    male


    #定义阶段不会报错,调用阶段会报错
    x='male'
    def register(sex=x):
    print(sex)
    #----------------
    x=None
    register()
    #输出
    #male

    x=[]
    def register(name,name_list=x):
    name_list.append(name)
    register('ASB')
    register('YSB')
    register('WSB')
    print(x)

    ['ASB', 'YSB', 'WSB']

     

     


    4.*args和**kwargs

     

    *args


    def foo(x,*args):    #args=(2,3,4,5,6,6,'a','b')     按位置传值多的给args
    print(x)
    print(args)
    foo(1,2,3,4,5,6,6,'a','b')

    #*args与位置参数和默认参数混用:*args要放到位置参数后面

    例1.
    def foo(x,*args,y=1): #位置参数,默认参数,*args
    print(x)
    print(y)
    print(args)

    foo(1,2,3,4,5)                 !!!!先按位置传值,再按关键字传值

    1
    1
    (2, 3, 4, 5)

    例2.

    def foo(x,y=1,*args):
        print(x)
    print(y)
    print(args)

    foo(1,2,3,4,5)

    1
    2
    (3, 4, 5)


    def my_sum(*nums): #nums=(1,2,3,4,5,6)
    res=0
    for i in nums:
    res+=i
    return res

    从形参的角度
    ##*(1,2,3) = *args
    def foo(*args):
      print(args)

    foo(1,2,3)

    (1,2,3)


    从实参的角度
    def bar(x,y,z):
      print(x)
      print(y)
      print(z)
    bar(*(1,2,3))         ##bar(1,2,3)

    1
    2
    3

     


    **kwargs


    def foo(x,**kwargs):       #把按关键字传值多余的值做成字典   x是位置,这题关键字只有一个
      print(x)       #核心是按关键字传值,关键字一定在位置的右面
      print(kwargs)
    foo(1,y=2,a=3,b=4)

    1
    {'a': 3, 'y': 2, 'b': 4}

    混着用的位置问题

    例1.
    def foo(x,*args,**kwargs):                      #按位置传值多的才给*args,一般给最前面的x,按关键字传值多的给**kwargs
      

      print(x)

      print(args)                #kwargs按关键字传值
      print(kwargs)

    1
    ()
    {'z': 2, 'y': 1}

    例2.

    def foo(*args,**kwargs):

    print(args)
    print(kwargs)
    foo(1,1,1,1)

    (1, 1, 1, 1)
    {}

    例3.

    def auth(name,password,sex='male'):
    print(name)
    print(password)
    print(sex)
    def foo(*args,**kwargs):
    print('from foo')
    auth(*args,**kwargs)

    foo('egon','123')

    from foo
    egon
    123
    male

    def auth(name,password,sex='male'):
    print(name)
    print(password)
    print(sex)
    def timmer(*args,**kwargs):
    print('from timmer')
    auth(*args,**kwargs)

    timmer(name='jax',password=123)

    from timmer
    jax
    123
    male



  • 相关阅读:
    C#网络安全的一个不错的站点
    SP2已经发布,明天MS要发布一个Exchange的package
    Python学习足迹(3)
    用例子来彻底搞明白Virtual 和 非 virtual(C#)
    概述Web编程的安全极其防护措施(主要针对PHP,PERL)[]
    Java序列化
    Mybatis缓存及原理
    代理模式
    Spring的依赖注入
    Mybatis运行流程
  • 原文地址:https://www.cnblogs.com/jiangshitong/p/6674846.html
Copyright © 2011-2022 走看看