Lambda 函数
Python 函数一般使用 def a_function_name() 样式来定义,但是对于 lambda 函数来说,我们其实根本没为它命名.这是因为 lambda 函数的功能是执行某种简单的表达式或运算,而无需完全定义函数.
Map 函数
Map() 是一种内置的 Python 函数,它可以将函数应用于各种数据结构中的元素,如列表或字典.对于这种运算来说,这是一种非常干净而且可读的执行方式.
Filter 函数
filter 内置函数与 map 函数非常相似,它也将函数应用于序列结构(列表、元组、字典).二者的关键区别在于 filter() 将只返回应用函数返回 True 的元素.
Itertools 模块
Python 的 Itertools 模块是处理迭代器的工具集合.迭代器是一种可以在 for 循环语句(包括列表、元组和字典)中使用的数据类型.
使用 Itertools 模块中的函数让你可以执行很多迭代器操作,这些操作通常需要多行函数和复杂的列表理解.
Generator 函数
其实,Generator函数是一个类似于迭代器的函数,就是它也可以用在 for 循环语句中.这大大简化了你的代码,而且相比简单的 for 循环,它节省了很多内存.
Python中有许多内置函数,不像print、len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性
Counter
容器名简介
namedtuple() 创建命名元组子类的工厂函数
deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典的子类,保存了他们被添加的顺序
defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了字符串对象,简化了字符串子类化
其中Counter中文意思是计数器,也就是我们常用于统计的一种数据类型,在使用Counter之后可以让我们的代码更加简单易读.Counter类继承dict类,所以它能使用dict类里面的方法
举例
#统计词频
fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']
result = {}
for fruit in fruits:
if not result.get(fruit):
result[fruit] = 1
else:
result[fruit] += 1
print(result)
from collections import Counter
c = Counter(fruits)
print(dict(c))
elements()
返回一个迭代器,其中每个元素将重复出现计数值所指定次.元素会按首次出现的顺序返回.如果一个元素的计数值小于1,elements()将会忽略它.
sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']most_common([n])
返回一个列表,其中包含n个最常见的元素及出现次数,按常见程度由高到低排序.如果n被省略或为None,most_common()将返回计数器中的所有元素.计数值相等的元素按首次出现的顺序排序:
实战
给你一个字符串数组words,请你找出所有在words的每个字符串中都出现的共用字符(包括重复字符),并以数组形式返回.你可以按任意顺序返回答案.
输入:words = ["bella", "label", "roller"]
输出:["e", "l", "l"]
输入:words = ["cool", "lock", "cook"]
输出:["c", "o"]看到统计字符,典型的可以用Counter完美解决.这道题是找出字符串列表里面每个元素都包含的字符,首先可以用Counter计算出每个元素每个字符出现的次数,依次取交集最后得出所有元素共同存在的字符,然后利用elements输出共用字符出现的次数
class Solution:
def commonChars(self, words: List[str]) - List[str]:
ans = Counter(words[0])
for i in words[1:]:
ans = Counter(i)
sorted
在处理数据过程中,我们经常会用到排序操作,比如将列表、字典、元组里面的元素正/倒排序.这时候就需要用到sorted(),它可以对任何可迭代对象进行排序,并返回列表
对列表升序操作:
print(a)
fruits = ['apple', 'watermelon', 'pear', 'banana']
a = sorted(fruits, key = lambda x : len(x))
# 输出:['pear', 'apple', 'banana', 'watermelon']all
all() 函数用于判断给定的可迭代参数iterable中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False.元素除了是 0、空、None、False外都算True.注意:空元组、空列表返回值为True.
all(['a', 'b', 'c', 'd']) # 列表list,元素都不为空或0
True
all(['a', 'b', '', 'd']) # 列表list,存在一个为空的元素
False
all(('a', 'b', 'c', 'd')) # 元组tuple,元素都不为空或0
all(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
all([]) # 空列表
all(()) # 空元组
Trueany函数正好和all函数相反:判断一个tuple或者list是否全为空,0,False.如果全为空,0,False,则返回False;如果不全为空,则返回True.
F-strings
s1='Hello'
# Hello World!在F-strings中我们也可以执行函数:
def power(x):
return x*x
print(f'{x} * {x} = {power(x)}')
本文主要讲解了python几种冷门但好用的函数,更多内容以后会陆陆续续更新~
(1)Lambda函数
用于创建匿名函数,即没有名称的函数.它只是一个表达式,函数体比def简单很多.当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了.
Lamdba的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.
利用Lamdba函数,往往可以将代码简化许多.
会将一个函数映射到一个输入列表的所有元素上,比如我们先创建了一个函数来返回一个大写的输入单词,然后将此函数应有到列表colors中的所有元素.
我们还可以使用匿名函数lamdba来配合map函数,这样可以更加精简.
当需要对一个列表进行一些计算并返回结果时,reduce()是个非常有用的函数.举个例子,当需要计算一个整数列表所有元素的乘积时,即可使用reduce函数实现.
它与函数的最大的区别就是,reduce()里的映射函数(function)接收两个参数,而map接收一个参数.
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中.
它的两个参数,一个是序列、迭代器或其他支持迭代对象;另一个是下标起始位置,默认情况从0开始,也可以自定义计数器的起始编号.
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
当我们使用zip()函数时,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同.
Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.
函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数.
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以?def?关键词开头,后接函数标识符名称和圆括号().
任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数.
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明.
函数内容以冒号起始,并且缩进.
return [表达式]?结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回 None.
语法
def functionname( parameters ): ? "函数_文档字符串"
function_suite
return [expression]
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的.
实例
以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上.
def printme( str ): ? "打印传入的字符串到标准显示设备上"
print str
return
函数调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构.
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行.
如下实例调用了printme()函数:
# 定义函数def printme( str ): ? "打印任何传入的字符串"
# 调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")
以上实例输出结果:
我要调用用户自定义函数!再次调用同一函数
参数传递
在 python 中,类型属于对象,变量是没有类型的:
a="Runoob"
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象.
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组.如fun(a),传递的只是a的值,没有影响a对象本身.比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身.
可变类型:类似 c++ 的引用传递,如 列表,字典.如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象.
python 传不可变对象实例
def ChangeInt( a ): ? ?a = 10
传可变对象实例
# 可写函数说明def changeme( mylist ): ? "修改传入的列表"
print "函数内取值: ", mylist
实例中传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果如下:
参数
以下是调用函数时可使用的正式参数类型:
必备参数
关键字参数
默认参数
不定长参数
必备参数须以正确的顺序传入函数.调用时的数量必须和声明时的一样.
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
#可写函数说明def printme( str ): ? "打印任何传入的字符串"
#调用printme函数printme()
Traceback (most recent call last):
File "test.py", line 11, in module
printme()TypeError: printme() takes exactly 1 argument (0 given)
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值.
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值.
以下实例在函数 printme() 调用时使用参数名:
#调用printme函数printme( str = "My string")
My string
下例能将关键字参数顺序不重要展示得更清楚:
#可写函数说明def printinfo( name, age ): ? "打印任何传入的字符串"
print "Name: ", name
print "Age ", age
调用函数时,默认参数的值如果没有传入,则被认为是默认值.下例会打印默认的age,如果age没有被传入:
def functionname([formal_args,] *var_args_tuple ): ? "函数_文档字符串"
加了星号(*)的变量名会存放所有未命名的变量参数.不定长参数实例如下:
# 可写函数说明def printinfo( arg1, *vartuple ): ? "打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple: ? ? ?print var
匿名函数
python 使用 lambda 来创建匿名函数.
lambda只是一个表达式,函数体比def简单很多.
lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数.
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率.
lambda函数的语法只包含一个语句,如下:
如下实例:
return 语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的return语句返回None.之前的例子都没有示范如何返回数值,下例便告诉你怎么做:
print "函数内 : ", total
return total
变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的.访问权限决定于这个变量是在哪里赋值的.
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称.两种最基本的变量作用域如下:
全局变量
局部变量
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域.
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问.调用函数时,所有在函数内声明的变量名称都将被加入到作用域中.如下实例:
print "函数内是局部变量 : ", total
Python中如何实现运算符的重载,即实现例如a+b这样的运算符操作呢?
在C++中可以使用 operator 关键字实现运算符的重载.但是在Python中没有类似这样的关键字,所以要实现运算符的重载,就要用到Python的魔法函数.Python魔法函数是以双下划线开头,双下划线结尾的一组函数.我们在类定义中最常用到的 __init__ 函数就是这样一个魔法函数,它在创建类对象时被自动调用.
下面我们来看个简单的例子.
代码中还有一个特殊的 __call__ 函数,该函数在将对象采用函数调用方式使用时被调用, 例如v1()相当于v1. call ().