Python-part8-函数1

1 什么是函数

函数就是具备某一功能的工具

2 为什么要用函数

1 程序的组织结构不清晰,可读性差
2 代码冗余
3 可扩展性差

3 如何用函数

函数的使用必须遵循的原则:先定义,后调用
修理工事先准备工具的过程即函数的定义
修理工遇到应用场景拿来工具就用即函数的调用

语法:

    def 函数名(参数1,参数2,...):
        """
        文档注释
        """
        code1
        code2
        code3
        ......
        return 返回值

def:定义函数的关键字
函数名: 就相当于一个变量名,指向函数的内存地址,
注意:函数的内存地址()就可以出发函数体代码的执行

参数: 参数是函数的调用者为函数体代码传值的媒介,在python中函数的参数无需声明类型
"""文档注释""" : 推荐写上
代码块:就是函数体功能的具体实现
return 返回值 :函数体代码块运行的成果

函数的使用分为两个阶段:
定义阶段: 只检测语法,不执行代码
调用阶段:运行函数体代码
def foo():
xxx
print()

先定义

 def foo():
   print("from foo")

后调用

 print(foo)
 foo() # 定义时无参,意味着调用时也无需传入参数

先定义

 def bar(x,y):
    print(x)
     print(y)

后调用

   bar('a',2) ## 定义时无参,意味着调用时也必须传入参数

定义无参函数:当函数体的代码逻辑不依赖任何传入的值就能执行,就不需要定义参数

 def print_msg():
     print('='*50)
     print('welecome.....'.center(50,' '))
     print('='*50)

 print_msg()
 print_msg()

定义有参函数:当函数体的代码逻辑依赖于外部调用者传入的值才能执行,必须定义参数用来接收外部传入的值

 def max2(x,y):
    # x=1
     # y=3
     if x > y:
         print(x)
     else:
         print(y)
 max2(1,4)


 def max2(x,y):
      if x > y:
         return x
     else:
         return y
 res=max2(1,4)
 print(res)


 def foo():
     print('from foo')
     bar()
 foo()

 def bar():
     print('from bar')

 def foo():
     print('from foo')
     bar()
 foo()

定义阶段

 def foo():
    print('from foo')
      bar()

 def bar():
     print('from bar')

调用阶段

 foo()

定义阶段

def foo():
   print('from foo')
    bar()

调用阶段

foo()

def bar():
    print('from bar')

一 定义函数的三种形式

1.1 无参函数

  def foo():
    print('from foo')
foo()

1.2 有参函数

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

1.3 空函数

def func():
    pass

ftp
def upload():
    pass

def download():
    pass

def login():
    pass

def register():
    pass

def ls():
    pass

二 调用函数的三种形式

2.1 #语句形式

def foo():
    print('from foo')
foo()

2.2 表达式形式

def foo(x,y):
    res = x + y
    return res

res=foo(1,2) #表达式形式
res1=foo(1,2)*100
print(res1)

2.3 可以当作参数传给另外一个函数

def max2(x,y):
    if x > y:
        return x
    else:
        return y

1 2 3
res=max2(max2(1,2),3)
print(res)

一 函数的返回值需要注意:

1 返回值没有类型限制
2 返回值没有个数限制
返回1个值:调用函数拿到的结果就是一个值
返回多个值:调用函数拿到的结果就是一个元组
返回0个值,或者不写return:调用函数拿到的结果就是None

二 return关键字:return是函数结束的标志,函数内可以有多个return,但只要执行一次,整个函数就结束

def f1():
    print('first')
    return 1
    print('second')
    return 2
    print('third')
    return 3

res=f1()
print(res)

def foo():
    count=1
    while True:
        print(count)
        if count == 3:
            return
        count+=1

foo()

def bar():
    pass

def foo():
    return [1,2],1,1.3,{'x':1},bar

res=foo()
print(res)

def func():
    print('from foo')
    # return

res=func()
print(res)

函数的参数分为两大类:

1 形参: 指的是在定义函数阶段括号内指定变量名,即形参本质就是"变量名"

2 实参: 指的是在调用函数阶段括号内传入的值,即实参本质就是"值"

形参与实参的关系:在调用函数时,会将实参(值)赋值(绑定)给形参(变量名),
这种绑定关系在函数调用时临时生效,在调用结束后就失效了

    def foo(x,y): # x=1 y=2
       x=1
       y=2
      print(x,y)
     foo(1,2)

形参与实参的具体分类

一 位置参数

1.1 位置形参: 在定义函数阶段按照从左到右的顺序依次定义的形参,称之为位置形参

注意:但凡按照位置定义的形参,必须被传值,多一个不行,少一个也不行

def foo(x,y):
    print(x,y)
foo(1,2)
foo(1,2,3)
foo(1,)
1.2 位置实参: 在调用函数阶段按照从左到右的顺序依次传入的值,称之为位置实参

注意:但凡按照位置定义的实参,会与形参一一对应

def foo(x,y):
    print(x,y)

foo(2,1)

二 关键字参数

关键字实参: 在调用函数阶段,按照key=value的形式指名道姓地为形参传值

注意:

  1. 可以完全打乱顺序,但仍然能指名道姓为指定的形参传值
  2. 可以混合使用位置实参与关键字实参,但是必须注意:

2.1 位置实参必须放到关键字实参前面
2.2 不能对一个形参重复赋值

    def foo(name,age):
        print(name,age)

    foo('egon',18)
    foo(18,'egon')
    foo(age=18,name='egon')

    foo('egon',age=18)
    foo(name='egon',18)
    foo('egon',age=18,name='lxx')

    open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
    open('a.txt','w',encoding='utf-8')

三 默认参数

默认参数:指的是在定义函数阶段,就已经为某个形参赋值了,改形参称之为有默认值的形参,简称默认形参

注意:

  1. 在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
  2. 位置形参应该放到默认形参前面
  3. 默认参数的值在函数定义阶段就已经固定死了
  4. 默认参数的值通常应该是不可变类型
def foo(x,y=2):
    print(x,y)

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

def foo(y=2,x):
    print(x,y)

m=10
def foo(x,y=m):
    print(x,y)

m=20
foo(1)


def register(name,hobby,l=[]):
    l.append(hobby)
    print('%s 的爱好为 %s' %(name,l))

register('alex','piao')
register('lxx','喝腰子汤')
register('yxx','不洗澡')
register('egon','read')

def register(name, hobby, l=None):
    if l is None:
        l=[]
    l.append(hobby)
    print('%s 的爱好为 %s' % (name, l))

register('alex', 'piao',[])
register('lxx', '喝腰子汤',[])
register('yxx', '不洗澡',[])
register('egon', 'read',[])

位置形参vs默认形参

对于大多情况下传的值都不相同的,应该定义成位置形参
对于大多情况下传的值都相同的,应该定义成默认形参

def register(name,age,sex='男'):
    print(name,age,sex)

register('李铁蛋',18,)
register('李银蛋',28)
register('张铜蛋',38)
register('刘卤蛋',48)
register('刘二丫',19,'女')

四 可变长度的参数

站在实参的角度,参数长度可变指的是在调用函数时,传入的实参值的个数不固定
而实参的定义方式无法两种:位置实参,关键字实参,对应着形参也必须有两种解决方案*,类分别应对溢出的位置实参与关键字实参

  1. 在形参中带:会将调用函数时溢出位置实参保存成元组的形式,然后赋值后的变量名
def foo(x,y,*z): #z=(3,4,5,6)
    print(x,y,z)

foo(1,2,3,4,5,6)
  1. 在实参中带: 但凡在实参中带星的,在传值前都先将其打散成位置实参,再进行赋值
def foo(x,y,*z): #z=(3,4,5,6)
    print(x,y,z)
foo(1,*[2,3,4,5,6]) # foo(1,2,3,4,5,6)

def foo(x,y,z):
    print(x,y,z)
foo(1,*(2,3,4,5,6)) #foo(1,2,3,4,5,6)
foo(*(1,2,3)) #foo(1,2,3)
foo(*'hello')  #foo()
foo(*'abc')  #foo('a','b','c')
  1. 在形参中带:会将调用函数时溢出关键字实参保存成字典的形式,然后赋值后的变量名
def foo(x,y,**z): #z={'z':3,'a':1,'b':2}
    print(x,y,z)

foo(1,y=2,a=1,b=2,c=3)
  1. 在实参中带: 但凡在实参中带星的,在传值前都先将其打散成关键字实参,再进行赋值
def foo(x,y,**z): #z={'a':100,'b':200}
    print(x,y,z)

foo(1,**{'a':100,'b':200,'y':111}) #foo(1,b=200,a=100,y=111)


def foo(x,y,z):
    print(x,y,z)

foo(**{'y':111,'x':222,'z':333}) #foo(z=333,x=222,y=111)
  1. 规范: 在形参中带的,后的变量名应该为args,**后跟的变量名应该时kwargs
def foo(*args,**kwargs): #args=(1,2,3,4,5) kwargs={'a':1,'b':2,'c':3}
    print(args)
    print(kwargs)
foo(1,2,3,4,5,a=1,b=2,c=3)


def bar(x,y,z):
    print(x,y,z)

def wrapper(*args,**kwargs): #args=(1,2,3,4,5,6) kwargs={'a':1,'b':2,'c':3}
    bar(*args,**kwargs)
    #bar(*(1,2,3,4,5,6),**{'a':1,'b':2,'c':3})  #bar(1,2,3,4,5,6,a=1,b=2,c=3)
wrapper(1,2,3,4,5,6,a=1,b=2,c=3)

!!!!!!!!!!!!!!!当我们想要将传给一个函数的参数格式原方不动地转嫁给其内部的一个函数,应该使用下面这种形式

def bar(x,y,z):
    print(x,y,z)

def wrapper(*args,**kwargs): #args=(1,2) kwargs={'z':3}
    bar(*args,**kwargs)
    #bar(*(1,2),**{'z':3})  #bar(1,2,z=3)
wrapper(1,2,z=3) # 虽然调用的是wrapper,但是要遵循的确是bar的参数标准

五 命名关键字参数: 放到 * 与 ** 之间的参数称之为命名关键字参数

注意: 命名关键字参数必须按照key=value的形式传值

def foo(x,y,*args,m,n,**kwargs): #args=(3,4,5,6,7,8)
    print(x,y) # 1,2
    print(args) #(3,4,5,6,7,8)
    print(m,n) #222,333
    print(kwargs)

foo(1,2,3,4,5,6,7,8,n=333,m=222,a=1,b=2)


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

foo(y=2222,x=1111)
foo(y=2222)


def foo(x,y=1,*args,m,**kwargs):
    print(x)
    print(y)
    print(args)
    print(m)
    print(kwargs)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容