102 函数

函数

编程中的函数在 BASIC 中叫做 subroutine(子过程或子程序),在 Pascal 中叫做 procedure(过程)和 function,在C中只有 function,在 Java 里面叫做 method。

函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  • 减少重复代码
  • 使程序变的可扩展
  • 使程序变得易维护

1、函数参数

形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

局部变量:作用域只在当前函数内部,外部变量默认不能被函数内部修改,只能引用

位置参数必须按顺序摆放
默认参数关键参数必须放在位置参数后面
非固定参数,*args = () 是以位置参数的形式传入,**kwargs =() 是以关键参数的形式传入

2、全局与局部变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

**当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
**

函数在执行过程中只要遇到return语句,就会停止执行并返回结果,即函数的结束

3、递归

一个函数在内部调用自身本身,这个函数就是递归函数。

递归特性:

  • 必须有一个明确的结束条件
  • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  • 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

4、匿名函数

匿名函数就是不需要显式的指定函数,匿名函数最复杂的就是三元运算

#这段代码
def calc(n):
    return n**n
print(calc(10))
 
#换成匿名函数
calc = lambda n:n**n
print(calc(10))

不过匿名函数主要是和其它函数搭配使用,如下

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)
#输出
1
25
49
16
64

5、高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

6、内置函数

6.1 数学相关

  • abs(a) : 求取绝对值。abs(-1)
  • max(list) : 求取list最大值。max([1,2,3])
  • ** min(list) 😗* 求取list最小值。min([1,2,3])
  • **sum(list) : **求取list元素的和。 sum([1,2,3]) >>> 6
  • sorted(list) : 排序,返回排序后的list。
  • ** len(list) : **list长度,len([1,2,3])
  • ** divmod(a,b)😗* 获取商和余数。 divmod(5,2) >>> (2,1)
  • ** pow(a,b) : **获取乘方数。pow(2,3) >>> 8
  • **round(a,b) : **获取指定位数的小数。a代表浮点数,b代表要保留的位数。round(3.1415926,2) >>> 3.14
  • ** range(a[,b]) : **生成一个a到b的数组,左闭右开。 range(1,10) >>> [1,2,3,4,5,6,7,8,9]

6.2 类型转换

  • **int(str) : **转换为int型。int('1') >>> 1
  • ** float(int/str) 😗* 将int型或字符型转换为浮点型。float('1') >>> 1.0
  • ** str(int) : **转换为字符型。str(1) >>> '1'
  • ** bool(int) : **转换为布尔类型。 str(0) >>> False str(None) >>> False
  • **bytes(str,code) : **接收一个字符串,与所要编码的格式,返回一个字节流类型。bytes('abc', 'utf-8') >>> b'abc' bytes(u'爬虫', 'utf-8') >>> b'\xe7\x88\xac\xe8\x99\xab'
  • **list(iterable) : **转换为list。 list((1,2,3)) >>> [1,2,3]
  • iter(iterable): 返回一个可迭代的对象。 iter([1,2,3]) >>> <list_iterator object at 0x0000000003813B00>
  • dict(iterable) : 转换为dict。 dict([('a', 1), ('b', 2), ('c', 3)]) >>>
  • ** enumerate(iterable) : **返回一个枚举对象。
  • **tuple(iterable) : **转换为tuple。 tuple([1,2,3]) >>>(1,2,3)
  • ** set(iterable) : **转换为set。 set([1,4,2,4,3,5]) >>> {1,2,3,4,5} set({1:'a',2:'b',3:'c'}) >>>
  • hex(int) : 转换为16进制。hex(1024) >>> '0x400'
  • **oct(int) : **转换为8进制。 oct(1024) >>> '0o2000'
  • **bin(int) : **转换为2进制。 bin(1024) >>> '0b10000000000'
  • ** chr(int) 😗* 转换数字为相应ASCI码字符。 chr(65) >>> 'A'
  • **ord(str) : **转换ASCI字符为相应的数字。 ord('A') >>> 65
  • **format() : **格式化输出字符串,format(value, format_spec)实质上是调用了value的__format__(format_spec)方法。

6.3 相关操作

  • dir():查看对象的所有操作方法
  • **eval() : **执行一个表达式,或字符串作为运算。 eval('1+1') >>> 2
  • ** exec() : **执行python语句。 exec('print("Python")') >>> Python
  • ** complie() : **将字符串编译成python能识别或可以执行的代码,按 exec 或 eval 的方式解析并执行
  • **filter(func, iterable) : **通过判断函数fun,筛选符合条件的元素。 filter(lambda x: x<3, [1,2,3,4,5,6]) >>> [1,2]
  • **map(func, *iterable) : **将func用于每个iterable对象。 map(lambda a,b: a+b, [1,2,3,4], [5,6,7]) >>> [6,8,10]
  • **reduce() : **是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
  • **zip(*iterable) : **将iterable分组合并。返回一个zip对象。 list(zip([1,2,3],[4,5,6])) >>> [(1, 4), (2, 5), (3, 6)]
  • ** type():**返回一个对象的类型。
  • **id(): **返回一个对象的唯一标识值。
  • hash(object):返回一个对象的hash值,具有相同值的object具有相同的hash值。 hash('python') >>> 7070808359261009780
  • help():调用系统内置的帮助系统。
  • ** isinstance():**判断一个对象是否为该类的一个实例。
  • issubclass():判断一个类是否为另一个类的子类。
  • globals() : 返回当前全局变量(内置和自定义变量)的字典。
  • **locals() : **打印局部变量
  • vars() : 不加参数相当于locals,加参数相当于dir()
  • next(iterator[, default]) : 接收一个迭代器,返回迭代器中的数值,如果设置了default,则当迭代器中的元素遍历后,输出default内容。
  • ** reversed(sequence) :** 生成一个反转序列的迭代器。 reversed('abc') >>> ['c','b','a']
  • bytearray() : 在内存你直接更改字符串,不必复制一份
  • **memoryview() : **是 bytearray 的底层
  • frozenset() : 创建一个不可修改的集合。
  • **repr() : **str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式。
  • slice() : 列表切片、计算步长的底层
  • **__import__() : **导入模块,用户输入的是字符串的时候
posted @ 2017-02-09 23:13  workhorse  阅读(124)  评论(0编辑  收藏  举报