空函数的实现
有时候,我们只写了一个函数声明,这在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
小作业
要求如下: