zoukankan      html  css  js  c++  java
  • 函数的定义和参数调用

    (1)对函数名的理解-函数名是什么?

    函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值;但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量

    1.1)函数的内存

    #函数的内存
    >>> def func(): print('python') >>> print(func) <function func at 0x038E5DB0> >>>

    通过上面代码可以我们知道,函数名指向的是这个函数的内存地址,其实深一步理解可得知,与其说函数名()可以执行这个函数,不如说是函数的内存地址()才是执行这个函数的关键

    1.2)函数名赋值给其他变量

    #函数名可以赋值给其他变量
    def func():
        print('python')
    
    print(func)#打印函数地址
    
    a=func#把函数当成一个变量复制给另一个变量
    
    a()#函数调用func()

    运行结果:

    <function func at 0x013EC588>
    python

    总结:

    通过变量的赋值,变量a,和变量func都指向的这个函数的内存地址,那么a() 当然可以执行这个函数了。

    1.3)函数名可以作为容器类的元素

    #eg1:变量可以当中容器类类型的元素
    a=1
    b='2'
    c='a'
    ll=[a,b,c]
    for i in ll:
        print(i)
    运行结果:
    1
    2
    a
    
    #eg2:函数名可当做容器类元素
    def func1():
        print("in func1: 嘻嘻")
    def func2():
        print("in func2: 哈哈")
    def func3():
        print("in func3: 咯咯")
    def func4():
        print("in func4: 吱吱")
    lst = [func1, func2, func3, func4]
    for i in lst:
        i()
    运行结果:
    in func1: 嘻嘻
    in func2: 哈哈
    in func3: 咯咯
    in func4: 吱吱

    1.4)函数名可作为函数的参数

    def func1():
        print('in func1')
    
    def func2(f):
        print('in func2')
        f()
    
    func2(func1)

    运行结果

    in func2
    in func1

    1.5)函数名可以作为函数的返回值

    def func1():
        print('in func1')
    
    def func2(f):
        print('in func2')
        return f
    
    ret = func2(func1)
    ret()  # ret, f, func1 都是指向的func1这个函数的内存地址

    运行结果:

    in func2
    in func1

    怎样定义函数?
    def 函数名():  

      函数体

    >>> def date(): //定义函数,函数名只能包含字符串、下划线和数字且不能以数字开头
        print("拿出电脑")
        print("开机")
        print('运行代码')

    >>> date() //调用,只有解释器读到函数名() 时,才会执行此函数,如果没有这条指令,函数里面即使有10万行代码也是不执行的。 拿出电脑 开机 运行代码

    函数的返回值:return
    那么这个返回值如何设置呢?这就得用到python中的一个关键字:return

    >>> def date():
        print("拿出电脑")
        print("开机")
        print('运行代码')
        return 
        print("ok,运行成功")
        
    >>> date()
    拿出电脑
    开机
    运行代码  //ok,运行成功未打印
    >>> 

    总结一下:

      1.遇到return,函数结束,return下面的(函数内)的代码不会执行。

      2.return 会给函数的执行者返回值。

          如果return后面什么都不写,或者函数中没有return,则返回的结果是None

          如果return后面写了一个值,返回给调用者这个值;return 'a'  结果:a

          如果return后面写了多个结果,,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量。eg:return 'a','b','c' 运行结果:('a','b','c')

    函数参数:形参,实参:
      1.形参

        写在函数声明的位置的变量叫形参,形式上的一个完整.表示这个函数需要xxx

      2.实参

        在函数调用的时候给函数传递的值.加实参,实际执行的时候给函数传递的信息.表示给函数xxx

     函数的传参就是函数将实际参数交给形式参数的过程.

    >>> def date(mode):  //函数定义时(参数),形参
        print("拿出电脑:%s"%mode)
        print("开机")
        print('运行代码')
        print("ok 走起")
    
    >>> date('dell')  //函数执行时(参数),实参
    拿出电脑:dell
    开机
    运行代码
    ok 走起
    >>> 

    代码运行到date('dell')开始执行此函数同时将字符串'dell'这个数据传递给变量mode,然后执行函数中的代 码。

    实参:分三种:位置参数、关键字参数、混合参数

    #关键字参数与位置参数混合使用,关键字参数要位于位置参数后
    def
    date(name, mode, sale): print("拿出电脑") print("电脑型号") print('设置筛选条件:商品: %s,型号:%s,价格:%s' %(name, mode, sale)) date('电脑',mode='dell',sale='2000',)

    形参:分两种:位置参数、默认值参数

    注意:必须先声明在位置参数,才能声明关键字参数
    >>> def stu_info(name,age,sex=''): print('录入学生信息') print(name,age,sex) print('录入完成') >>> stu_info('张强',18) SyntaxError: invalid character in identifier >>> stu_info('张强',18) 录入学生信息 张强 18 男 录入完成

    位置参数主要是实参与形参从左至右一一对应,默认值参数,如果实参不传参,则形参使用默认参数。那么无论是位置参数,还是默认参数,函数调用时传入多少实参,我必须写等数量的形参去对应接收, 如果不这样,那么就会报错:

    def eat(a,b,c,):
    print('我请你吃:',a,b,c) 
    eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭') # 报错

    形参的第三个关键参数:关键字参数*args、**kwargs

    (1)*args,形参会将实参所有的位置参数接收,放置在一个元组中,并将这个元组赋值给args这个形参
    >>> def study(*args):
        print('学习内容:',args)
    
        
    >>> study('python','shell','mysql')
    学习内容: ('python', 'shell', 'mysql')
    >>>(2)**kwargs,接受所有的关键字参数然后将其转换成一个字典赋值给kwargs这个形参
    >>> def study(**args):
        print('学习内容:',args)
    
        
    >>> study(study1='python',study2='shell')
    学习内容: {'study1': 'python', 'study2': 'shell'}
    >>> 

     *args一定要在位置参数与默认值参数中间:位置参数,*args,默认参数

    >>> def func(a,b,*args,class_name='python'):
        print(a,b)
        print(args)
        print(class_name)
    
        
    >>> func(1,2,3,4,5)
    1 2
    (3, 4, 5)
    python
    >>> 

    形参的顺序为:位置参数,*args,默认参数,**kwargs。

    >>> def func(a,b,*args,sex='',**kwargs):
        print(args) 
        print(sex) 
        print(a,b) 
        print(kwargs)
    
    >>> func(1, 2, 3, 4, 5,name='a')
    (3, 4, 5)
    男
    1 2
    {'name': 'a'}
    >>> 

     形参角度的所有形参的最终顺序为:位置参数,*args,默认参数,仅限关键字参数,**kwargs。

    >>> def foo(a,b,*args,c,sex=None,**kwargs):
        print(a,b) //位置参数
        print(args) //args参数
        print(c) //默认参数
        print(sex) //关键字参数
        print(kwargs) //**kwargs参数
    
        
    >>> foo(1,2,3,4,c=6,name='alex',sex='')
    1 2
    (3, 4)
    6
    男
    {'name': 'alex'}
    >>> 
  • 相关阅读:
    C#仿制QQ弹出消息框
    Winform下载文件
    asp.net文件下载
    C#FileStream复制大文件【转自www.bitsCN.com】
    C#解压或压缩文件夹
    TreeView无级级绑定
    C# WinForm窗口最小化到系统托盘
    [C#]实现序列号生成器
    VS2005小技巧收集(一)
    Failed TO CREATE LOGFILE GROUP解决
  • 原文地址:https://www.cnblogs.com/bashliuhe/p/13182859.html
Copyright © 2011-2022 走看看