最近用到了python中的zip函数,在菜鸟教程中查看了相关函数的使用方法,但是对zip(*)
一直不明白怎么运行的,今天突然想到了不定量参数传递给函数的问题,似乎对zip(*)
有了一些新的理解。
首先是对不定量参数*args
,**kwargs
传参进行简单的说明:
*args
:用来发送一个非键值对的可变数量的参数列表给一个函数
**kwargs
:是将不定长的键值对作为参数传递给一个函数
相关的例子有很多,而且也很简单,这里不再赘述,总结一句话就是:*
和**
都有打包和解包的作用,在定义函数的时候使用,是打包的意思,在调用函数的时候则是解包的作用。如:
def f(*args): # 可以接受任意长度的参数,把所有参数打包后给args
print(args) # 这里的args则是打包后的元组
调用函数时:
def func(a,b,c):
xxxxxx
li = [1,2,3]
func(*li) # 这是*就起到了解包的作用,*li则是把列表解压成一个个参数
func(*li) <==> func(1,2,3)
当然**
则是对键值对参数进行打包解包,原理一样,就不作说明了,有兴趣的可以问度娘。
下面是对zip函数的使用,在菜鸟教程中可以查看相关使用方法,这里直接摘抄了,哈哈!
描述
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
注意:zip 方法在 Python 2 和 Python 3 中的不同:在 Python 2.x zip() 返回的是一个列表。
zip 语法:
zip([iterable, ...])
参数说明:
- iterable – 一个或多个迭代器;
返回值
返回一个对象
起初对:利用 * 号操作符,可以将元组解压为列表一直不理解,今天有所明白:
举个例子:
a = [1, 2, 3]
b = ["a", "b", "c"]
zip(a, b) # 返回的是一个对象
list(zip(a, b)) # 输出为:[(1, 'a'), (2, 'b'), (3, 'c')]
那么zip(*iterable)有什么作用呢,肯定是跟zip()作用相反的
举个例子:
ll = ["flower", "flow", "flqwe"]
zip(*ll) 返回的结果是什么呢?
如果单独记忆“利用 * 号操作符,可以将元组解压为列表”,估计很难说出答案,其实使用打包解包的思想,就很容易明白了:
1、*xx
在调用函数的时候是解包作用,因此:*ll ==> "flower", "flow", "flqwe"
2、 zip(*ll) ==> zip("flower", "flow", "flqwe")这跟zip(a, b)没什么两样
是不是很简单,以前一直没想通,又可以少记一个内置函数了!
最后解一道可以用zip()方法解题的LeetCode算法题:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解题思路:先使用zip(*li)对字符串数组进行元素打包,然后使用set()函数去重,如果去重后的元素长度为1,则是公共前缀。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
s = ""
for i in list(zip(*strs)):
ss = set(i)
if len(ss) == 1:
s += ss.pop()
else:
break # 只要有一个不是一就跳出
return s