天天看点

python 九——函数、迭代器、map、reduce、lambda\random模

参考文章:https://www.cnblogs.com/sly27/p/8707191.html

一、函数基础

1.1 创建函数

标题行由def关键字,函数名,以及参数的集合组成;def子句的剩余部分包括了一个虽然可选但是强烈推荐推荐的文档字串,和必需的函数体。

函数用def语句创建,语法:

def function_name(arguments):

“function_documentation_string”

function_body_suite

注意:

1)前向引用:函数不允许在函数未声明之前对其进行引用或者调用

2)内部函数:在函数体内创建另一个函数是完全合法的,这种函数叫做内部/内嵌函数

1.2 调用函数

1)函数操作符:使用一对圆括号()调用函数,如果没有圆括号,只是对函数的引用;

任何输入的参数都必须放置在括号中。

2)关键字参数:关键字参数的概念仅仅针对函数的调用,让调用者通过函数调用中的参数名字来区分参数。

3)参数组:python允许程序执行一个没有显示定义参数的函数;方法是通过把元组(非关键字参数,用*)和字典(关键字参数,用 ‘**’)作为参数组传递给函数

1.3 匿名函数

1)lambda

lambda [arg1[,arg2,…argN]:expression]

python允许用lamber关键字创造匿名函数,匿名是因为不需要以标准的def的方式 来声明。

一个完整的lambda 语句代表了一个表达式,这个表达式的定义体必须和声明放在同一行。

2) filter() 函数

filter(func,seq):调用一个布尔函数func来迭代遍历每个序列中的元素;返回一个使func返回值为true的元素的序列。

如果布尔函数比较简单,直接使用lambda匿名函数九显得非常方便。

1.4 迭代器

迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序列的第一个元素开始访问,直到所有的元素都被访问才结束。

1 、 创建迭代器

A、使用内建的工厂函数iter(iterable)可以将可迭代序列转换为迭代器

B、自定义迭代器 :Python中迭代器的本质上每次调用__next__()方法都返回下一个元素或抛出StopIteration的容器对象。

2、迭代器的方法:

由于Python中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:

1)、有__next__()方法,返回容器的下一个元素或抛出StopIteration异常

2)、有__iter__()方法,返回迭代器本身

案例》创建迭代器

1 a=[1,2,3,4]

2 b=(1,2,3)

3 str=‘Tomwenxing’

4 print(iter(a))

5 print(iter(b))

6 print(iter(str))

二 、函数高级应用

2.1 变量作用域

标识符的作用域是定义为其声明在程序里的可应用范围,也就是变量的可见性。

1)全局变量

在一个模块中最高级别的变量有全局作用域,它会存活到脚本运行结束。

2) 局部变量

局部变量,仅能依赖于定义它们的函数现阶段是否处于活动,函数一旦完成,框架被释放,变量将会离开作用域。

如果局部变量与全局变量同名,那么定义了局部变量的函数运行时,局部变量会覆盖全局变量。

3)global语句

因为全局变量的名字可以被局部变量覆盖,所以为了明确地引用一个已命名的全局变量,必须使用global语句。

4)名字空间

三个活动的作用域:局部、全局、内建;

标识符的搜索顺序依次是:局部、全局、内建

2.2 函数式编程

  1. 偏函数

    一个带有多个参数的函数,如果其中某些参数基本上固定的,那么就可以通过偏函数为致谢参数赋值默认值

    2)递归函数

    如果函数包含了对其自身的调用,该函数就是递归的。

    3)生成器

    在Python中,这种一边循环一边计算的机制,称为生成器:generator。生成器用于生成一个值的序列

    生成器是一个带yield语句的函数,一个函数或者子程序只返回一次,但是生成器能暂停执行并返回一个中间的结果。

    创建一个generator方法一:只要把一个列表生成式的[]改成(),就创建了一个generator;

    方法二:

    当生成器的next() 方法被调用的时候,它会准确地从离开地方继续;

    与迭代器相似,生成器以另外的方式来运作,当到达一个真正的返回或者函数结束没有更多的值返回,StopIteration异常就会被抛出。

2.3 内部函数

  1. 闭包

    闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来;闭包的词法变量不属于全局名字空间域或者局部的,而是属于其他的名字空间,带着“流浪”的作用域。闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意地切换是很有用的。闭包也是函数,但是它们能携带一些额外的作用域。

  2. 装饰器

    装饰器是在函数调用之上的修饰,这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用。

    使用装饰器的情形:

    ——引入日志

    ——增加计时逻辑来检测性能

    ——给函数加入事务的能力。

三 、 map() 函数

map() 会根据提供的函数对指定序列做映射,Map的主要作用就是:并行。

map() 函数语法:map(function, iterable, …)

function – 函数;iterable – 一个或多个序列

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。Python 2.x 返回列表。Python 3.x 返回迭代器。

注意:python3中map()返回的是一个object,因为map()转变成了迭代器来节约空间,返回的是可迭代对象。

所以,需要list可以直接用list(……)来强制返回一个列表。

案例>

def square(x):

return x ** 2

result = map(square, [1, 2, 3, 4])

print(result)

print(type(result))

print(list(result))

四、 reduce()函数

reduce()的使用方法形如reduce(function, iterable[, initializer]),它的形式和map()函数一样。不过参数f(x)必须有两个参数,initializer是可选的,一个序列,和一个可选的初始化器。

工作原理:reduce通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值来实现。然后又用这个值和序列的下一个元素来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止。

五、random模块

5.1 random.random

random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0

5.2 random.uniform

random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。

5.3 random.randint

andom.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

5.4 random.randrange

random.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。

5.5 random.choice

random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。

5.6 random.shuffle

random.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱。

5.7 random.sample

random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。