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

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

原文地址:https://www.cnblogs.com/liuyang521/p/14202910.html