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'}
    >>> 
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/bashliuhe/p/13182859.html
Copyright © 2011-2022 走看看