python系列教程178——再聊函数

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

让我们再来看一个函数的例子,以便进一步地解释函数的基本概念。

下面将一段代码封装在了函数中,使它成为一个通用搜索交集的工具。

def intersect(seq1,seq2):

    res = []                   # Start empty

    for x in seq1:             # Scan seq1

        if x in seq2:    # Common item?

           res.append(x)       # Add to end

    return res

我们可以通过在括号中传递两个序列对象从而调用这个函数:

>>>s1 = "SPAM"

>>>s2 = "SCAM"

>>>intersect(s1,s2)       # Strings

['S','A','M']

这里,我们传递了两个字符串,并且得到了一个包含着用逗号分隔的字符的列表。这个函数的算法相当的简单:“对于第一个参数中的所有元素,如果也出现在第二个参数之中,将它增加至结果之中”。

实际上,这个函数里的代码可以用一个单独的列表解析表达式来替代:

>>>[x for x in s1 if x in s2]

['S','A','M']

和所有的Python中的函数一样,intersect这个函数是多态的。也就是说,它可以支持多种类型:

>>>x = intersect([1,2,3],(1,4))       # Mixed types

>>>x                                               # Saved result object

[1]

这次,我们给函数传递了不同类型的对象[一个列表和一个元组(混合类型)]。这个intersect函数可以对传递给它的任何序列对象进行迭代,只要这些序列支持预期的接口就行了。

对于intersect函数,第一个参数必须支持for循环,并且第二个参数支持成员测试。所有满足这两点的对象都能够正常工作,与它们的类型无关,例如,字符串和列表,文件和字典。

如果我们传入了不支持这些接口的对象(例如,数字),Python将会自动检测出不匹配,并抛出一个异常。

intersect函数中的res变量在Python中叫做本地变量——这个变量只是在def内的函数中是可见的,并且仅在函数运行时是存在的。实际上,由于所有的在函数内部进行赋值的变量名都默认为本地变量,所以intersect函数内的所有的变量均为本地变量。
•res是明显的被赋值过的,所以它是一个本地变量。
•参数也是通过赋值被传入的,所以seq1和seq2也是本地变量。
•for循环将元素赋值给了一个变量,所以变量x也是本地变量。

所有的本地变量都会在函数调用时出现,并在函数退出时消失——intersect函数末尾的return语句返回结果对象,但是变量res却消失了。

你可能感兴趣的:(python系列教程,python,开发语言,人工智能)