zoukankan      html  css  js  c++  java
  • 1、函数的基本使用

    1.先定义、后引用

    2.函数参数的使用

    1---------形参

    (一)-------------位置形参

    (二)-------------默认形参

    2---------实参

    (一)-------------位置实参

    (二)-------------关键字实参

    3-------------* 与 ** 在实参与形参的应用

    >>>>>>>>>>>>函数的介绍<<<<<<<<<<<<<<

    致命三连击

    '''

    1、什么是函数: ps::函数就是盛放代码的容器

    工匠干活需要事先准备(工具包=函数)
        具备某一功能的工具 = 函数
        事先准备工具的过程 = 函数的定义
        遇到场景就拿来用 = 函数的调用
    所以函数的使用原则: 先定义 后调用
    

    2、为何要用函数

      解决下列问题
       1、代码组织结构不清晰,可读性差
       2、可扩展性差
    

    3、如何用函数

    定义的语法:
         def 函数名  通常起动词 登录:login 注册
         def(参数1,参数2,参数3.....):
             ’‘’函数的文档注释‘’‘
             代码1
             代码2
             代码3
             return  返回值
    

    一、定义函数

    发生的事情:
    1、申请内存空间把函数体代码放进去
    2、将函数内存地址绑定给函数名
    ==强调== :定义函数 只检测语法,不执行代码
    
    def login():   login = 函数的内存地址
          print(111)
          print(111)
          print(111)
    
    x = 10 的意思是等与 10 的内存地址
    print(x) >>>>> 10 不过是 python 帮我们完成了取值的工作
    but print(login)   >>>>打印的是内存地址
    

    二、调用函数

    login() 先通过变量名login找到代码,再加上()运行 两件事情
    发生的事情:
            1、先通过函数名定位找到函数的内存地址
            2、函数的内存地址()触发代码运行
            #==强调:调用函数才会执行代码==
    

    定义、调用的几个小例子

    def func():
          print(111    #==语法错误
          print(111)
          x           #==语法没问题,但是调用会出错,x未定义
    =======================
    def bar()
          print('from bar')
    def foo():
          print(from foo)
          bar
    foo()              #== 正常运行 from bar   from foo 
    ======================
    def foo():
          print(from foo)
          bar
    def bar()
          print('from bar')
    foo()            #== 正常运行  先定义 后调用
    

    三、定义函数的三种形式

    3.1 无参 #已经写死了 不需要输入内容

    def func():
                print('xxx')
          def say():
                print('>>>>>')
                print('happy')
          def login():
                inp_name = input('username>>>>:')   #== 虽然输入内容 不过是 input 提供的==
                inp_pwd = input('pwd>>>>>:')
                if inp_name == 'liu' and inp_pwd == '123':
                      print('successful login...')
                else:
                      print('username or pwd error')
          login()
    

    3.2 有参

    def func():
        print(x)
    func(111)                 可以输入变化的值
          
    def max2(x,y)
        if x > y:
            print(x)
        else:
            print(y)
    max2(10,20)
    

    3.3空

    def login():      #==用来写程序构思搭建
        psss 或  ...
    

    四、调用函数的三种形式

    4.1 语句
          len('hello')
    4.2 表达式
          res = len('hello') *10
          print(res)>>>>>> 50
    4.3 可以当作参数传给另一个函数
          print(len('hello'))
    

    >>>>>>>>>>函数参数使用<<<<<<<<<<

    总体分为两大类
    1、形参:在函数定义阶段括号内指定的参数,称之为形式参数,简称形参  等同于变量名
    2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参   等同于变量值
    
    形参与实参的关系
    在调用函数时,实参值会绑定给形参名,在函数调用完毕解除绑定
    
    def func (x,y):
        # x=111
        # y=222           #== 相当于把 111赋值给 x 把222赋值给 y
        print(x,y)
    
    m=111
    n=222
    func(111,222)
    

    >>>>>>>>>>形参系列<<<<<<<<<<

    一、位置形参:在定义函数时,按照从左到右的顺序依次定义变量名,称之为位置形参

    特点:每次调用时,必须被赋值,不可多不可少

    def func(x,y):
          print(x)
          print(y)
    func(1,2)
    

    二、默认形参:在定义函数时,就已经为某个形参赋值,称之为默认形参

    特点:调用时可以不用赋值 非要赋值 也行。。

    def func(name,age=18):
          print(name)
          print(age)
    func('liu')       #== 位置形参,‘liu'会赋值给 name 下面会详细说明
    

    注意::1、可以混用位置形参和默认形参,但是必须是位置形参在前,默认形参在后

            2、默认形参的值通常是==不可变类型==
            3、默认形参的值,是在==函数定义的阶段赋值==
    
    def func(name,hobby,hobbies = None):      #== 先把hobbies定义为空
          if hobbies is None:                 #== 每次循环为空的时候,
                hobbies = [ ]  #== 先定义为    #== 得到都是空列表
          hobbies.append(hobby)               #== 然后把个人爱好加上去,
          print('%s的爱好是%s'%(name,hobbies)  #== 最后得到的不会叠加
    func('liu','study')      >>>>>>> liu 的爱好是['study']
    func('li','read')            
    func('egon','play')
    func('lili','eat',['moive'])      lili的爱好是['eat','moive']
    

    >>>>>>>>>>实参系列<<<<<<<<<<

    二、位置实参:在调用函数的时候,从左到右依次传入的值,称之为位置实参

    特点:按照位置为形参赋值,一一对应 和列表 list 类似

    func('liu',18)
    func(18,'liu')
    

    三、关键字实参:在调用函数的时候,按照 key=value 的形式传值,称之为关键字传值

    特点:可以打乱顺序 仍然可以为指定参数赋值,和字典dict类似 字典也无序

    func(x=1,y=2)

    #==注意:可以混用位置实参与关键字实参,但是...
                1、位置实参必须在关键字实参的前面
                2、不能为同一形参重复赋值
    例:func('liu',age=18)
        func(age=18.'liu')  #== Error,关键字实参必须在位置实参后
    

    错误小例子

    def foo(x,y,z):
        pass
    foo(1,y=2.3)       #== Error,位置实参必须在前
    foo(1,y=2,z=3,x=4)  ##Error x 重复赋值
    

    >>>>>>>>>>可变长系列<<<<<<<<<<

    可边长参数指的是在调用函数时,传入的实参个数不固定,对应着必须有特殊形式的形参来接收溢出的实参

    实参无非两种形式
    溢出位置实参用 * 接收
    溢出的关键字实参用 ** 接收

    * 和 ** 在形参中是一种汇总的行为

    1、* 在形参中的应用: * 会将溢出的位置和合并成一个元组,然后赋值给紧跟其后的形参名

    def func(x,*args):
          print(x)       >>>>> 1
          print(args)    >>>>>>(2,3,4)
    func(1,2,3,4)       
    

    2、** 在形参中的应用: **会将溢出的关键字实参合并成一个字典,然后赋值给紧跟其后的形参名

    def func(x,**kwargs):
          print(x)          >>>>> 1
          print(kwargs)     >>>>> {'a':1,'b':2}
    func(1,a=1,b=2)
    

    小应用

    def my_sun(*args):
          res = 0
          for i in args:
                res += i
                print(res) >>>>>> 10
    my_sum(1,2,3,4)
    

    * 和 ** 在实参中是一种打散行为

    * 在实参中的应用: * 后跟可以被for循环遍历的任意类型 * 会将紧跟其后的那个值打散成位置实参

    def func(x,y,z):
          print(x)
          print(y)
          print(z)
    func(*[11,22,33])  >>>11 22 33
    func('hello')  '>>>>>>h','e','l','l','o'
    func(*{'k1':111,'k2':222})    >>>>'k1','k2'
    

    **在实参中的应用: ** 只能跟字典类型,会将字典打散成关键字实参

    例:
    def index(x,y,z)
         print(x,y,z)
    def wrapper(*args,**kwargs):
         print(args)
         print(kwargs)
         index(*args,**kwargs) >>>>>>index(1,2,3,a=1,a=2)
    wrapper(1,2,3,a=1,a=2)
    

    了解:命名关键字形参: 在* 与**中间的形参称为命名关键字形参

    特点:必须按照key=value的形式传值

    def func(x,*args,y=222,z,**kwargs):
         print(x)
         print(args)
         print(y)
         print(z)
       print(kwargs)
    func(x,args,y,z,kwargs)
    

    >>>>>>>>>>return<<<<<<<<<<

    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    res = max2(10,20)
    print(res * 12)
    

    return详解:

    1、函数可以有多个return,但只要执行一次return,整个函数就立即结束,并且将return后的值当做本次调用的结果返回

    def func():
        print("=====")
        return 111
        print("****")
        return 222
        print("----------")
        return 333
    
    res = func()
    print(res)>>>>>>>>>> ========
    
    2、return后的返回值有三种情况
    (1)return 值:返回的就是这一个值
    (2)return 值1,值2,值3:返回的一个元组
    def func():
        return 111,"xxx",[22,33]
    
    res = func()
    print(res)>>>>>>> (111,'xxx',[22,33])
    

    (3)函数内可以没有return、或者return None、或者return:返回的都是None

    def func():
        print(111)>>>>>>正常输出   111
        return      >>>>>遇到return 程序终止,返回None
        print(2222)
    
    
    res = func()
    print(res)>>>>111 None
    

    乘风破浪会有时,直挂云帆济沧海...

  • 相关阅读:
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    jchdl
    UVa 437 (变形的LIS) The Tower of Babylon
    UVa 1025 (动态规划) A Spy in the Metro
    UVa 10129 (并查集 + 欧拉路径) Play on Words
  • 原文地址:https://www.cnblogs.com/liuyang521/p/14202910.html
Copyright © 2011-2022 走看看