Python培训(二)—函数

函数定义

  • Python 中的函数用 def 关键字定义,如下所示:

def sortNum(numberOne, numberTwo):
	if numberOne > numberTwo:
		return numberOne, numberTwo
	else:
		return numberTwo, numberOne


a = 10
b = 11
a, b = sortNum(a, b)
  • 大家可以先悟上面这个代码,def 定义了函数,里面是两个参数,Python 中没有类型,所有很简介,代码块用:和缩进区分。

  • 如果要返回值,需要用 return,返回多个值就用逗号分开,如上所示。实际上返回的就是之前讲过的元组。上面的例子已经展示了。

上次作业实例

  • 我们顺便把上次作业解决了,来熟悉一下列表和字典。我们想要达到如下效果:

  • 我们要统计一段话里面连续 n 个字出现次数,比如 “我觉得”,可以分解成 “我觉” 和 "觉得",这就是两个字的统计。

  • 要可以将两篇文章统计在一起。

  • 统计连续1、2、3个字的情况放在列表里。

def updateKeyword(newSentence, originDict, keywordLength):
    for index in range(0, len(newSentence) - keywordLength):
        keyword = newSentence[index: index + keywordLength]
        if originDict.get(keyword):
            originDict[keyword] += 1
        else:
            originDict[keyword] = 1


sentenceOne = "每个人都依靠自己的知识和认识,却又被之所束缚,还将这些称之为现实。"\
			  "但知识和认识是非常暧昧的东西,那个现实也许只不过是镜花水月,人们都"\
    		  "是活在自我意识之中的,你不这样认为吗?你这双眼睛又能看多远呢?"
sentenceTwo = "上面这是随便抄的句子"
keywordList = [{}, {}, {}]
for index in range(0, 3):
    updateKeyword(sentenceOne, keywordList[index], index + 1)
    updateKeyword(sentenceTwo, keywordList[index], index + 1)
print('finish')
  • 大家细品一下,参数传递进去以后,默认复杂结构是引用传参,也就是函数里的变化外面会变,就是C++指针的含义。

  • 那么什么是复杂结构?除了数字、字符串(因为字符串本身就不允许变),其他的列表、元组、字典全都是复杂结构。数字传递只能是值传递,不能引用传递,所以如果要在函数里面处理数据,必须要 return 才能得到。

  • 如果要创建列表的副本,可以进行切片,切片返回的都是副本。可以参考书的 95 页。

Pycharm调试技巧

  • 由于大家都是萌新,我就谈一下 Pycharm 调试的方法吧,其他软件也都差不多。

  • 如上,在代码行标号后面点一下,就可以有一个红色的点,那个就是断点。Pycharm 选择 run 的时候不会在断点停下,但是在 debug的时候就会在断点停下。这个时候,就会出现上面这个界面。

  • 变量都会显示,我说的把结果 print 出来,只是一种形象说法,大家只要把主要结果截图给我就好了。

  • 然后如果有逻辑错误,就要进行调试了,在断点停下来后,如图,中间那一栏有几个箭头,分别表示执行下一个语句,进入函数等,大家把鼠标悬停在上面或者亲手试一下就知道了。这样就可以一行一行执行代码,然后在变量区观察变量的情况。

  • 如图,在python console这一栏,可以一行一行输入代码执行,就和MATLAB命令行一样,旁边也会显示变量,而且这里和脚本是两个平行空间,互不干扰,所以在这里可以进行一些实验(这也是我喜欢用Pycharm原因)。

关键字参数和默认值

  • 向上面这种传参方法,有一个缺点,就是当参数过多的时候,我们很难记住参数的顺序,到底哪个参数我写在了前面,哪个写在了后面。所以就有一个新的写发,如下:

def hello(greeting, name="Jerry"):
    print(name, greeting)


hello(name="Tom", greeting="Hello!")
  • 是不是完全是人类的思维,这样只需要记住名字就可以了,设置默认值也和C++一样,大家应该很熟悉了。

  • 当然,我们可以结合位置参数和关键字参数,应该很好想象,必须先指定位置参数,再指定关键字参数,没有看明白想深入了解的可以看 99 页

收集参数

  • 有时候我们想要输入任意数量的参数,比如一个储存名字的函数 store,可能需要输入任意个名字字符串,Python可以完成这个任务:

def store(originList, *params):
	pass


nameList = []
store(nameList, 'Tom', 'Jerry')
  • 在参数前面加一个 * ,那么这后面的参数就会被放在一个元组中同时传递,也就是说上面这个例子 params = ('Tom', 'Jerry') 这样。

  • 带星号参数可以不放在最后,但是建议不要这么做,因为容易出错。

  • 星号不会收集关键字参数,要收集关键字参数,需要加两个星号,如下:

def test(**params):
	pass
	
	
test(x=1, y=1, z=3)
  • 如上,param就不是一个元组,而是一个字典 {‘x’: 1, 'y': 2, 'z': 3},是不是超级好理解。

  • 当然了,作为萌新大家只要记住有这个东西,目前自己写函数是很少用到的,慢慢对 python 熟悉了再回来看就简单了。

作业

  • 想不出来题目,大家自己写一下上面那个 ”上次作业实例“ 的代码,截图自己写的代码发我就好。


本文章使用limfx的vsocde插件快速发布