Python编程_Lesson010_函数高级特性

空函数的实现

有时候,我们只写了一个函数声明,这在Python中是不可以的,我们还需要对这个函数进行实现,但是我们还没有确定好这个函数的功能,那该怎么办呢?我们可以使用pass关键字来实现!

>>> def myfunc():
    pass

函数的高级特性

函数的本质

我们一开始就接触的一个函数,叫做print函数,那么它有什么特性呢?

>>> print
<built-in function print>
>>> type(print)
<class 'builtin_function_or_method'>

从上面我们可以看出,当不加圆括弧的时候,print是一个内建函数或者方法,但实际上,print还可以当成一个变量来使用

>>> print = 100
>>> print
100

此时print将无法在实现输出的功能了。

>>> type(print)
<class 'int'>
>>> print(250)
Traceback (most recent call last):
  File "<pyshell#174>", line 1, in <module>
    print(250)
TypeError: 'int' object is not callable

如果想让print恢复原来的功能,我们必须对我们的IDLE进行重置。

我们可以把print赋值给一个变量,那么这个变量就拥有了print的功能

>>> print(250)
250
>>> myfunc = print
>>> myfunc(250)
250

从上面可以看出,函数名其实就是一个变量。
在Python中,任何一个函数名都是一个变量!!!
正是因为这些特性,我们可以利用这些特性做一些东西!!!我们可以将函数名当做函数的参数传递过去。

>>> def myfunc(x, func):
    func(x)


>>> myfunc(250, print)
250

我们使用map对象可以做下面的事情:

>>> map(print, [1,2,3,4])
<map object at 0x000001E1E1F6DE80>

它会返回一个map对象。
如果我们将返回的map对象转换成一个list:

>>> temp = map(print, [1,2,3,4])
>>> temp
<map object at 0x000001E1E1F81DA0>
>>> list(temp)
1
2
3
4
[None, None, None, None]

为什么会返回四个None,因为我们的print函数的返回值是None,而传递进去的四个值分别和print进行作用,然后得到print函数的返回值。
下面是我们自己定义的一个函数,传递给map对象,list(range(10)表示生产一个从0-9的列表。

>>> def foo(x):
    return x**2

>>> list(map(foo, list(range(10))))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

我们可以这样来导入一个包,比如导入reduce,它是属于functools里面的一个函数:

>>> from functools import reduce
>>> reduce
<built-in function reduce>

如果我们使用 import functools方法导入,那么它将会把functools中所有的函数导入进来,这样就可能导致函数重名等问题。

我们上面写的函数是一个参数,能够被map对象使用,但是如果我们定义的函数是2个参数呢,那还能使用map对象调用吗?我们可以先做一个实验。

>>> def add(x, y):
    return x+y

>>> list(map(add, list(range(10))))
Traceback (most recent call last):
  File "<pyshell#216>", line 1, in <module>
    list(map(add, list(range(10))))
TypeError: add() missing 1 required positional argument: 'y'

那么我们使用reduce看看能不能通过呢?

>>> def add(x, y):
    return x+y

>>> reduce(add, list(range(10)))
45

这个45的结果就是从0-9进行累加得来的。

下面我们来实现一个字符串转int的函数,不是Python内置的int函数转换的

>>> int("12345678")
12345678

我们自己的实现函数:

>>> def list2num(x, y):
    return x*10 + y

>>> def str2num(str):
    return {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}[str]

>>> numlist = list(map(str2num, '56782134'))
>>> numlist
[5, 6, 7, 8, 2, 1, 3, 4]
>>> reduce(list2num, numlist)
56782134

还有一个非常常用的函数filter,它可以制定一个筛选的对象。

>>> filter
<class 'filter'>
>>> type(filter)
<class 'type'>

我们可以使用filter函数对一些数字进行过滤,示例如下:

>>> def list2num(x, y):
    return x*10 + y

>>> def str2num(str):
    return {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}[str]

>>> def isodd(num):
    return num%2 == 1

>>> reduce(list2num, filter(isodd, map(str2num, '56782134')))
5713

我们还可以使用sorted函数进行排序,

>>> def list2num(x, y):
    return x*10 + y

>>> def str2num(str):
    return {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}[str]

>>> def isodd(num):
    return num%2 == 1

>>> reduce(list2num, filter(isodd, map(str2num, '56782134')))
5713
>>> reduce(list2num, sorted(filter(isodd, map(str2num, '56782134'))))
1357

sorted的函数还可以传递一个函数,可以是内建函数,也可以是自定义函数

>>> mylist = ['a', 'd', 'b', 'y', 'd', 'A', 'c']
>>> mylist
['a', 'd', 'b', 'y', 'd', 'A', 'c']
>>> sorted(mylist)
['A', 'a', 'b', 'c', 'd', 'd', 'y']
>>> sorted(mylist, key=str.lower)
['a', 'A', 'b', 'c', 'd', 'd', 'y']

在编程语言中有一种闭包的概念,当然在Python语言中也不例外。
闭包就相当于把函数返回去,起到了延时调用的作用。

>>> def sum(*args):
    numsum = 0
    for num in args:
        numsum += num
    return numsum

>>> def str2num(str):
    return {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}[str]

>>> num = sum(1,2,3,4,5,6,7,8,9)
>>> num
45

毫无疑问,上面的sum函数会被立即的返回。
下面我们使用闭包的方式进行函数调用

>>> def lazysum(*args):
    def sum():
        numsum = 0
        for num in args:
            numsum += num
        return numsum
    return sum

>>> num = lazysum(1,2,3,4,5,6,7,8,9)
>>> num
<function lazysum.<locals>.sum at 0x000001E1E1F99268>
>>> type(num)
<class 'function'>
>>> num()
45
>>> num1 = lazysum(1,2,3,4,5,6,7,8,9)
>>> num2 = lazysum(1,2,3,4,5,6,7,8,9, 10)
>>> num1()
45
>>> num2()
55

Python中同样也有匿名函数,它可以帮助我们生成一个函数

>>> foo = lambda num:num*num
>>> foo(10)
100

函数的绑定,和stl中的函数绑定一样进行参数的绑定

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1111000001111')
7695

小作业
要求如下:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值