python笔记2(函数)

一、 函数

在交互式命令行通过help(函数名)查看函数的帮助信息

1 基本函数

  • print()函数

    print()

    print会依次打印每个字符串,遇到逗号“,”会输出一个空格,print自动换行

  • input()函数

    input(),input输入的是str类型的

    a = input('name:')会输出提示信息

  • int()函数

    数据类型转换,将str转换为整数

    例:b = int(s)

  • abs函数

    求绝对值

  • max()函数

    可以接收任意多个参数,并返回最大的

  • hex()函数

    把一个整数转换成十六进制表示的字符串

  • range()函数

    可以生成一个整数序列,从0开始生产

    list()函数可以转换为list

    print(list(range(5)))

  • isinstance函数

    可以判断一个变量是不是什么

    isinstance(x, ...)

  • sum函数

    可以直接求和

2 定义函数

  1. 使用def语句,依次写出函数名、括号、括号中的参数和冒号:

  2. 在缩进块中编写函数体,函数的返回值用return语句返回

    def my_abs(x):

(1)定义一个空函数:

pass语句

例:def nop():
pass

(2)函数的参数

1.位置参数:

  • 调用函数时,传入的两个值按照位置顺序依次赋给参数

    例:def power(x):

2.默认参数:

  • 必选参数在前,默认参数在后

  • 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数

  • 可以按顺序提供默认参数

  • 可以不按顺序提供部分默认参数,但需将参数名加上

    默认参数必须指向不变对象

    例:def enroll(name, gender, age=6, city='Beijing'):

3.可变参数:

  • *args是可变参数,args接收的是一个tuple

  • *nums表示把nums这个list的所有元素作为可变参数传进去

  • 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple

  • 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

    例:def calc(*numbers):

4.关键字参数:

  • **kw是关键字参数,kw接收的是一个dict

  • 关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

  • 可以扩展函数的功能

  • 函数的调用者可以传入任意不受限制的关键字参数

  • 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})

    例:def person(name, age, **kw):

5.命名关键字参数

  • 命名的关键字参数是为了限制关键字参数,同时可以提供默认值(可以有缺省值)。
  • *后面的是命名关键字参数,如果已经有了可变参数,就不需要再加一个*
  • 命名关键字必须传入参数名
  • 每一个命名关键字参数都必须有值
  • 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

6.参数组合

  • 参数定义的顺序必须是:位置参数、默认参数、可变参数(*)、命名关键字参数(*)和关键字参数(**)
(3)参数检查

数据类型检查可以用内置函数isinstance()实现

if not isinstance(x, (int, float)):
raise TypeError('bad operand type')

(4)返回多个值(返回tuple)

Python的函数返回多值其实就是返回一个tuple

返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值

二、高级特性


1、切片

L[起始索引:结束索引:间隔大小],若第一个索引为0,可省略;若间隔大小为1,可省略;可以全部省略,则为复制

L[0:3]:0 <= L < 3 (不包含3)

可对list、tuple、字符串进行切片,灵活

支持倒数切片

2、迭代Iteration

for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)

在Python中,迭代是通过for ... in来完成的

dict的储存不是按照list的方式顺序排列的,迭代出的结果顺序可能不一样

dict迭代:

  • 默认情况下,dict迭代的是key
  • 如果要迭代value,可以用for value in d.values()
  • 如果要同时迭代key和value,可以用for k, v in d.items()

如何判断一个对象是可迭代对象呢?

方法是通过collections模块的Iterable类型判断:

from collections import Iterable
isinstance('abc', Iterable)

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

 for i, value in enumerate(['A', 'B', 'C']):
     print(i, value)

任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环

3、列表生成式

用来创建list的生成式

for循环创建list的生成式

[x * x for x in range(1, 11)]

4、生成器generator

这种一边循环一边计算的机制,称为生成器:generator

  • 创建一个generator
    • 1、方法很简单,只要把一个列表生成式的[]改成()
    • 2、函数定义中包含yield关键字,那么这个函数是一个generator

generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

  • 调用

    调用generator时,首先要生成一个generator对象,然后用next()函数不断获得下一个返回值

  • 返回值

    for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIterationvalue中:

  • 结束

    对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

5、迭代器Iterator

  • 可以直接作用于for循环的数据类型有:

    • list、tuple、dict、set、str
    • generator(包括生成器和带yield的函数)
  • 可以直接作用于for循环的对象统称为可迭代对象Iterable

    • 可以使用isinstance()判断一个对象是否是Iterable对象

    • from collections import Iterable

      例:

      from collections import Iterable

      isinstance([], Iterable)

  • next()函数调用并不断返回下一个值的对象称为迭代器Iterator

    • 可以使用isinstance()判断一个对象是否是Iterator对象

      例:

      from collections import Iterator

      isinstance((x for x in range(10)), Iterator)

  • 使用iter()list、dict、strIterable变成Iterator

三、函数式编程


1、高阶函数

函数就是面向过程的程序设计的基本单元

函数本身也可以赋值给变量,即:变量可以指向函数

函数名其实就是指向函数的变量

高阶函数:一个函数就可以接收另一个函数作为参数

  • map/reduce

    • map(两个参数)

      map函数接受两个参数,一个函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterable放回

      Iterator是惰性序列,通过list()函数让它把整个序列都计算出来并返回一个list

    • reduce(两个参数)

      把一个函数作用在一个序列[x1,x2,x3,x4......]

      这个函数必须接受两个参数,reduce把结果继续和下一个元素做累计计算

      reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)

  • filter:过滤序列(两个参数)

    接收一个函数与一个序列,与map类似依次作用于每个元素,但根据返回值确定是否丢弃元素

    返回值也是一个Iterator(惰性序列),需要list函数获取结果并返回list

  • sorted:排序算法(三个参数)

    可以接收一个key函数来实现自定义的排序

    例:sorted([3,65,3,4],key=abs)

    忽略大小写:

    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)

    进行反向排序,传入第三个参数reverse=True

    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

2、返回函数

相关参数和变量都保存在返回的函数中,称为“闭包”

每次调用互不影响

返回的函数不会立刻执行

返回函数不要引用任何循环变量,或者后续会发生变化的变量,如果使用的话,多次调用的结果会相同

3、匿名函数(lambda

关键字lambda表示匿名函数,冒号前面的x表示函数参数

list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

匿名函数只能有一个表达式,不用写return,返回值就是该表达式的结果

匿名函数不会冲突

匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,也可以吧匿名函数作为返回值返回

def build(x, y): return lambda: x * x + y * y

4、装饰器(@

在代码运行期间增加功能的方式,称为“装饰器”(Decorator)

函数有一个__name__可以拿到函数的名字

functools.wrap<==>wrapper.__name__ = func.__name__(交换函数签名)

一个完整的decorator:

import functools

def log(func):
	@functools.warps(func)

5、偏函数(functools.partial

偏函数(Partial function):把一个函数的某些参数固定

functools.partial创建一个偏函数,给一个函数设定默认参数(在函数调用的时候也可以传入其他值),返回一个新函数

int2 = functools.paratial(int,base=2)

创建偏函数的时候,可以接收函数对象*args**kw

四、 模块


作用域

  • 公开(public):正常的函数和变量名,可以被直接引用
  • 特殊变量:__xxx__,定义自己的变量一般不用
  • 私有(private):_xxx__xxx,不应该直接引用private函数
发布了41 篇原创文章 · 获赞 28 · 访问量 9068

猜你喜欢

转载自blog.csdn.net/wang15877/article/details/102826888
今日推荐