首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 回头看

先看上次代码答案:

本次小测试:

Question10

Level2

Question:

Write aprogram that accepts a sequence of whitespace separated wordsasinputandprints the words after removingallduplicate wordsandsorting them alphanumerically.

Suppose the followinginputissuppliedto the program:

hello worldandpractice makes perfectandhello world again

Then,the output should be:

againandhellomakes perfect practice world

We usesetcontainer to remove duplicated data automaticallyandthen usesorted()to sort the data.

写一程序,接收空白分隔的单词序列,去除重复的单词,排序并打印。

我们使用集合容器自动删除重复的数据,然后排序函数,然后打印。

我们以前还没有专门讨论过set,不过1个Python牛人,应该知道的,如果不知道,临时抱佛脚吧。或者用其他方法达成上面的效果。

下面是今天的topic:

本文译自英文资料,简单却比较系统,适合进一步巩固函数的有关知识和技能。

函数

函数是可以重复使用的程序片段,函数让程序员可以命名一段语句代码,允许人们使用这个具体的函数名,在任何地方,任何次数的重复使用。这就做调用函数。我们已经多次使用过像len 和 range这样的内置函数。

函数概念可能是任何一个程序语言最重要的基础,我们将在这一节探讨函数的各个方面。

函数用def 关键字定义,后面跟着标识符名字(函数名),然后是括号,括号内可以包含一些变量,然后是冒号。下一行就是代码块的开始。下面的例子,是不是挺简单?

Def sayHello():

Print(‘hello world’)

然后调用

sayHello()

sayHello()

调用多少次都行。

代码运行原理

上面的函数没有parameters(国内翻译成形式参数),所以没有再括号内声明变量。Parameter 对于函数,就是输入函数这个变量,所以,我可以直接传递给函数各种不同的值。然后函数返回相应的值。

看到了吗?我们可以两次调用同样的函数,而没有必要写两次函数内部的代码。

函数形式参数(parameters)

一个函数可以接收参数,这就是我们提供给函数的值,函数用这些值做些事情。这些参数就像变量,当我们调用(就是使用函数)函数时,这些变量的值已经被定义并且已经绑定了这些参数。

所以,有两个名称作为区别,一个是定义函数时的参数,叫做parameters,中文翻译为形式参数,另一个是调用函数时,我们提供给函数的参数值叫做arguments,实际参数。

例子:

Def printMax (a,b):

Print (a, ‘ is maximum’)

elif a == b:

print (a, ‘ is equal to’, b)

else:

print (b, ‘ is maximum’)

#下面直接传值

printMax(3,5)

下面传递实际参数

x= 5

y= 7

printMax ( x, y)

代码运行原理

我们定义了一个函数叫做 printMax用了两个形式参数,分别是 a 和 b; 我们用了一个简单的if .. else 语句, 然后打印出较大的数字。

第一次调用函数,我们直接提供数字作为实参,第二个例子,我们用变量作为实际参数。也就是实际参数的值赋值给了(绑定)了a 和b。

局部变量

当你在函数里面声明变量的时候,它们与函数外部同名的变量没有一毛钱关系。对函数来说,变量名字就是当地的,这就是变量的SCOPE(作用域)。所有变量都有才能够其定义开始点到代码块的作用域。

X = 50

Def func(x):

print(‘x is’, x)

x = 2

print(‘changed local x to’, x)

func(x)

print(‘x isstill’, x)

代码运行原理

在函数主体里第一行,我们第一次打印名字为x 的值,Python使用的是形式参数在函数外面声明的值,接下来,我们将2赋值给x ,x 是局部变量,当我们变动函数里面的x, 在函数外面的主体代码里x不受影响。

最后的这个print语句,我们展示了x在主体语句块中的值,证实了实际是不受函数里面的局部赋值所影响的。

全局语句

如果你将值赋给一个程序中最顶端的名字,(比如,没有在任何像函数和类之中的作用域中),有需要告诉Python,名称不受局部的,是全局的。 我们使用 global 语句做这事。不可能在函数外部,不使用global 语句来定义一个变量(译者表示怀疑)。

略(翻译了就有点乱)

其实是在函数内用global,来定义全局变量。(译者澄清)

默认实参值

有些函数,你可能需要让形式参数可选,并且使用默认值,以防用户不提供参数值。这样就用默认实参搞定。在函数定义时,用赋值运算符(=)后面跟着默认值连接起来,将默认值和形式参数名连接起来,这样就指定了形式参数的默认实际参数值。

请注意默认实际参数值是常数,更准确的说,默认值是不可变量,这会在今后章节详细解释。现在,只要记住就行。

例子:

Def say(message,times=1):

Print(message * times)

say(‘hello’)

say(‘world’, 5)

代码运行原理

say函数用于打印字符串,次数根据指定。如果我们不提供值,那么根据默认,字符串只打印一次。我们通过指定一个默认值 1 给形式参数 times 来达成这个目的。

在say 的第一次使用时,我们仅仅提供了字符串,所以它只打印了字符串一次。在第二次使用时,我们使用了字符串和实际参数5,指定要说信息5遍。

小心:

只有在形式参数结尾的形式参数才能给予默认实际参数值。你不能在一个没有默认值的形参前面有一个默认值的形参。这是因为值赋值给形参是依据位置的。例如:def func(a, b=5) 是有效的,但是 def func(a=5,b) 是无效的。

关键字实参

如果你有些函数有许多形式参数,你要具体指出一些参数,给予它们命名的值,这叫做关键字实际参数。我们使用名字(关键字)而不是用位置(我们一直这么做)来具体指向函数的实际参数。

这样做有两个好处,其一,使用函数更容易,因为我们无需担忧实际参数的次序。其二,我们只给予我们想要给予的,假设其他实际参数有默认实参值。

def func(a, b=5, c=10):

print('ais',a, 'and b is',b, 'and c is',c)

func(3, 7)

func(25, c=24)

func(c=50, a=100)

输出:

a is 3 and b is 7 and c is 10

a is 25and b is 5 and

c is 24 a is 100 and b is 5 and c is 50

代码运行原理

func函数有一个形式参数没有默认参数值,后面的两个形式参数有默认值。

第一个函数,func(3,7),形式参数a 得到3这个值,b 是 7;c 得到默认值10;

第二个函数,func(25,c=24), a 得到25的值,因为位置,c是24,因为定义,关键字定义。变量 b 得到默认的 5;

第三个函数,func(c=50,a=100), 我们使用关键字实参为所有参数赋值。请注意,次序已经无足轻重。

VarArgs形参

有时,我们定义的函数需要不定数量的形参,比如,不停的数量实参,可以用星号达成这个目的。

例子:

代码运行原理

当我们声明一个形式参数比如 *param, 然后所有的位置实参从这一点开始一直到结束叫被收集到元组被称作param。

相同的,当我们声明一个双星号的形式参数比如**param,我们把从哪一点开始到结尾的关键字参数收集为字典称作**param,我们会在今后章节探索元组和字典

return语句

此语句用于函数返回。比如结束函数,或者从函数返回值

例子太简单。略。

有几点说明,return后面没有表达式的话等同于return None;这个None是个特殊类型代表没有,空。每个函数暗含这个语句,除非你自己写了一个return语句。另外,顺便说一下,pass语句用于表示空语句块。

DocStrings

应该已经讨论过,略。

需要注意的是,虽然上面已经覆盖了函数的很多方面,但是还有其他,所以,继续学吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190203G0NEKN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券