python学习之三:函数

python函数思维导图:

函数是对特定功能模块的封装,利于代码的整洁和复用。python函数的定义和使用较为简单,具体如下:

1.定义和使用

def foo()://定义函数,foo为函数名,(arg1,arg2,....)为参数列表
    print('a function')//函数体
foo() //函数调用

有返回值的函数定义:

def foo(a,b):
    return a+b//使用return关键字返回
foo(10,20) 

返回多个值:

def foo(a,b):
    return a,b//返回多个值,用逗号隔开
type(foo(1,2)) //返回的是元组类型

使用yield关键字返回函数值:

def foo(a):
    for x in range(1,a):
        yield x
        x+=1
f=foo(5)//返回的是迭代器,通过next(f)调用
next(f)//1
next(f)//2
next(f)//3
next(f)//4
next(f)//报错,已经跌代完
def foo(a,b,*args):
    print(a,b)
#     print(type(args)) #<class 'tuple'>
    print(sum(args))
    
foo(1,2,3)
foo(1,2,3,5,6)
l1=[1,2,3]
# l1=(1,2,3)
foo(*l1)
foo(1,2,*t1)

yield关键字的逻辑:函数执行时,遇到yield就返回,下次调用next(f)时,从上次yield语句的下一句开始执行。

2.参数传递

通常情况下,函数定义时,参数个数是确定的,但是有时函数需要接受变长的参数,这个时候可以使用python的不定长参数来处理。python参数分为位置参数和关键字参数,具体如下:

一个位置参数的例子:

def foo(a,b,*args):
    print(a,b)
#     print(type(args)) #<class 'tuple'>
    print(sum(args))
    
 
foo(1,2,3,5,6)
l1=[1,2,3]
# l1=(1,2,3)
foo(*l1)
foo(1,2,*t1)

*args表示可以接受变长的参数,args的类型实际上是一个元组。还有一种简便的参数传递方式,就是可以先定义参数列表(或元组),再通过*l1的方式传递, 如上的foo(*l1),foo(1,2,*t1)。另外,参数定义时,可以赋值默认值,调用时不传递该参数值则使用默认值:

def foo(a,b=5):
    print(a,b)
foo(8)//8,5

关键字参数的例子:

def foo(a,year='2018年',**kwargs):
    print(a+year+"各个班级成绩:")
    for k,v in kwargs.items():
        print(k,v)
foo('清华大学',计算机科学与技术=95,信息工程=97,管理学院=89)
# dict={'计算机科学与技术':95,'信息工程':97,'管理学院':89}
# foo('清华大学',**dict)

此处不做另外说明,用法和上类似,注意在使用字典作为参数时,单引号不能丢。

关于参数传递:

a='python'
l1=['c','.net']
def foo(arg):
    a='java'
    l1.append('c#')
    print('>>>>',a)
    print('>>>>',l1)
foo(a)
print('>>>>',a)
print('>>>>',l1)

从上述可以看出a在函数调用之后值没有发生改变,但是l1却发生了改变。a是基于值传递不会改变参数本身,而l1则是基于指针引用的传递,会改变参数本身。

3.偏函数

import functools
mymax=functools.partial(max,100)//100是固定的
mymax(20)//调用

如上所述,偏函数是在参数定义时,固定部分参数的函数。

4.高阶函数

高阶函数中的参数是一个函数,即函数名作为参数传递给另外一个函数。eg:

def mysum(data,funct)://funct是另一个函数名称
    return funct(data)
    
mysum([1,2,3,4],max)//调用

有一些内置的比较常用的高阶函数:比如map,reduce,filter等。具体用法如下:

from functools import reduce
l1=[1,2,3,4,5,6,2,3,3,6]
list(map(lambda x:(x,l1.count(x)),l1 ))
list(filter(lambda x:True if x>4 else False,l1))
reduce(lambda x,y:x+y,l1)

5.匿名函数

foo=lambda x,y:x+y//匿名函数的定义,不用return
foo(1,2)

匿名函数通常用在高阶函数的定义上。

6.回调和闭包

一个闭包的例子:

def foo(arg):
    def foo1():
        return max(arg)
    return foo1
foo([1,2,3,4,5,6])()
foo中的foo1函数没有参数,但是其可以访问foo的参数,可以记住其外部变量的作用域。

一个回调的例子:

def callback():
    return max
callback()(10,20)

容易理解,不做详解。

python关于函数的基础内容大致就这些,本文只是一个扫盲,细节还需查阅官方文档。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值