Ⅰ python 定义函数
params=(5,)*2
#params=(5,5)
power(*params)
#实际上就是pow(5,5)=3125
Ⅱ python语言中用来定义函数的关键字是
python中定义函数的关键字是def。写函数时会写:def <函数名> (<参数列表>): ...
Ⅲ 在Python中定义Main函数
目录
许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数。
尽管如此,为程序的执行定义一个起始点有助于理解程序是如何运行的。Python程序员提出了几种方式对此进行实现。
本文结束时,您将了解以下内容:
Python中的基本main()函数
一些Python脚本中,包含一个函数定义和一个条件语句,如下所示:
此代码中,包含一个main()函数,在程序执行时打印Hello World!。此外,还包含一个条件(或if)语句,用于检查__name__的值并将其与字符串"__main__"进行比较。当if语句为True时,Python解释器将执行main()函数。更多关于Python条件语句的信息可以由此获得。
这种代码模式在Python文件中非常常见,它将作为脚本执行并导入另一个模块。为了帮助理解这段代码的执行方式,首先需要了解Python解释器如何根据代码的执行方式设置__name__。
Python中的执行模式
Python解释器执行代码有两种方式:
更多内容可参考如何运行Python脚本。无论采用哪种方式,Python都会定义一个名为__name__的特殊变量,该变量包含一个字符串,其值取决于代码的使用方式。
本文将如下示例文件保存为execution_methods.py,以 探索 代码如何根据上下文改变行为:
在此文件中,定义了三个对print()函数的调用。前两个打印一些介绍性短语。第三个print()会先打印短语The value __name__ is,之后将使用Python内置的repr()函数打印出__name__变量。
在Python中,repr()函数将对象转化为供解释器读取的形式。上述示例通过使用repr()函数来强调__name__的值为字符串。更多关于repr()的内容可参考Python文档。
在本文中,您将随处可见文件(file),模块(mole)和脚本(script)这三个字眼。实际上,三者之间并无太大的差别。不过,在强调代码目的时,还是存在细微的差异:
“如何运行Python脚本”一文也讨论了三者的差别。
基于命令行执行
在这类方法中,Python脚本将通过命令行来执行。
执行脚本时,无法与Python解释器正在执行的代码交互。关于如何通过命令行执行代码的详细信息对本文而言并不重要,但您可以通过展开下框阅读更多有关Windows,Linux和macOS之间命令行差异的内容。
命令行环境
不同的操作系统在使用命令行执行代码时存在细微的差异。
在Linux和macOS中,通常使用如下命令:
美元符号($)之前的内容可能有所不同,具体取决于您的用户名和计算机名称。您键入的命令位于$之后。在Linux或macOS上,Python3的可执行文件名为python3,因此可以通过输入python3 script_name.py来运行python脚本。
在Windows上,命令提示符通常如下所示:
根据您的用户名,>之前的内容可能会有所不同,您输入的命令位于>之后。在Windows上,Python3的可执行文件通常为python。因此可以通过输入python script_name.py来运行python脚本。
无论哪种操作系统,本文的Python脚本的输出结果都是相同的。因此本文以Linux和macOS为例。
使用命令行执行execution_methods.py,如下所示:
在这个示例中,__name__具有值'__main__',其中引号(')表明该值为字符串类型。
请记住,在Python中,使用单引号(')和双引号(")定义的字符串没有区别。更多关于字符串的内容请参考Python的基本数据类型。
如果在脚本中包含"shebang行"并直接执行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,将会获取相同的结果。
您还可以通过向命令行添加-m参数的方法实现以模块的方式执行。通常情况下,推荐如下方式pip: python3 -m pip install package_name。
添加-m参数将会运行包中__main__.py的代码。更多关于__main__.py文件的内容可参考如何将开源Python包发布到PyPI中。
在三种情况中,__name__都具有相同的值:字符串'__main__'。
技术细节:Python文档中具体定义了__name__何时取值为'__main__'。
当通过标准输入,脚本或者交互提示中读取数据时,模块的__name__将取值为'__main__'。(来源)
__name__与__doc__,__package__和其他属性一起存储在模块的全局命名空间。更多关于属性的信息可参考Python数据模型文档,特别是关于模块和包的信息,请参阅Python Import文档。
导入模块或解释器
接下来是Python解释器执行代码的第二种方式:导入。在开发模块或脚本时,可以使用import关键字导入他人已经构建的模块。
在导入过程中,Python执行指定模块中定义的语句(但仅在第一次导入模块时)。要演示导入execution_methods.py文件的结果,需要启动Python解释器,然后导入execution_methods.py文件:
在此代码输出中,Python解释器执行了三次print()函数调用。前两行由于没有变量,在输出方面与在命令行上作为脚本执行时完全相同。但是第三个输出存在差异。
当Python解释器导入代码时,__name__的值与要导入的模块的名称相同。您可以通过第三行的输出了解这一点。__name__的值为'execution_methods',是Python导入的.py文件。
注意如果您在没有退出Python时再次导入模块,将不会有输出。
注意:更多关于导入在Python中如何工作的内容请参考官方文档和Python中的绝对和相对导入。
Main函数的最佳实践
既然您已经了解两种执行方式上的差异,那么掌握一些最佳实践方案还是很有用的。它们将适用于编写作为脚本运行的代码或者在另一个模块导入的代码。
如下是四种实践方式:
将大部分代码放入函数或类中
请记住,Python解释器在导入模块时会执行模块中的所有代码。有时如果想要实现用户可控的代码,会导致一些副作用,例如:
在这种情况下,想要实现用户控制触发此代码的执行,而不是让Python解释器在导入模块时执行代码。
因此,最佳方法是将大部分代码包含在函数或类中。这是因为当Python解释器遇到def或class关键字时,它只存储这些定义供以后使用,并且在用户通知之前不会实际执行。
将如下代码保存在best_practices.py以证明这个想法:
在此代码中,首先从time模块中导入sleep()。
在这个示例中,参数以秒的形式传入sleep()函数中,解释器将暂停一段时间再运行。随后,使用print()函数打印关于代码描述的语句。
之后,定义一个process_data()函数,执行如下五项操作:
在命令行中执行
当你将此文件作为脚本用命令行执行时会发生什么呢?
Python解释器将执行函数定义之外的from time import sleep和print(),之后将创建函数process_data()。然后,脚本将退出而不做任何进一步的操作,因为脚本没有任何执行process_data()的代码。
如下是这段脚本的执行结果:
我们在这里看到的输出是第一个print()的结果。注意,从time导入和定义process_data()函数不产生结果。具体来说,调用定义在process_data()内部的print()不会打印结果。
导入模块或解释器执行
在会话(或其他模块)中导入此文件时,Python解释器将执行相同的步骤。
Python解释器导入文件后,您可以使用已导入模块中定义的任何变量,类或函数。为了证明这一点,我们将使用可交互的Python解释器。启动解释器,然后键入import best_practices:
导入best_practices.py后唯一的输出来自process_data()函数外定义的print()。导入模块或解释器执行与基于命令行执行类似。
使用__name__控制代码的执行
如何实现基于命令行而不使用Python解释器导入文件来执行呢?
您可以使用__name__来决定执行上下文,并且当__name__等于"__main__"时才执行process_data()。在best_practices.py文件中添加如下代码:
这段代码添加了一个条件语句来检验__name__的值。当值为"__main__"时,条件为True。记住当__name__变量的特殊值为"__main__"时意味着Python解释器会执行脚本而不是将其导入。
条件语块内添加了四行代码(第12,13,14和15行):
现在,在命令行中运行best_practices.py,并观察输出的变化:
首先,输出显示了process_data()函数外的print()的调用结果。
之后,data的值被打印。因为当Python解释器将文件作为脚本执行时,变量__name__具有值"__main__",因此条件语句被计算为True。
接下来,脚本将调用process_data()并传入data进行修改。当process_data执行时,将输出一些状态信息。最终,将输出modified_data的值。
现在您可以验证从解释器(或其他模块)导入best_practices.py后发生的事情了。如下示例演示了这种情况:
注意,当前结果与将条件语句添加到文件末尾之前相同。因为此时__name__变量的值为"best_practices",因此条件语句结果为False,Python将不执行process_data()。
创建名为main()的函数来包含要运行的代码
现在,您可以编写作为脚本由从命令行执行并导入且没有副作用的Python代码。接下来,您将学习如何编写代码并使其他程序员能轻松地理解其含义。
许多语言,如C,C++,Java以及其他的一些语言,都会定义一个叫做main()的函数,当编译程序时,操作系统会自动调用该函数。此函数通常被称为入口点(entry point),因为它是程序进入执行的起始位置。
相比之下,Python没有一个特殊的函数作为脚本的入口点。实际上在Python中可以将入口点定义成任何名称。
尽管Python不要求将函数命名为main(),但是最佳的做法是将入口点函数命名为main()。这样方便其他程序员定位程序的起点。
此外,main()函数应该包含Python解释器执行文件时要运行的任何代码。这比将代码放入条件语块中更好,因为用户可以在导入模块时重复使用main()函数。
修改best_practices.py文件如下所示:
在这个示例中,定义了一个main()函数,它包含了上面的条件语句块。之后修改条件语块执行main()。如果您将此代码作为脚本运行或导入,将获得与上一节相同的输出。
在main()中调用其他函数
另一种常见的实现方式是在main()中调用其他函数,而不是直接将代码写入main()。这样做的好处在于可以实现将几个独立运行的子任务整合。
例如,某个脚本有如下功能:
如果在单独的函数中各自实现这些子任务,您(或其他用户)可以很容易地实现代码重用。之后您可以在main()函数中创建默认的工作流。
您可以根据自己的情况选择是否使用此方案。将任务拆分为多个函数会使重用更容易,但会增加他人理解代码的难度。
修改best_practices.py文件如下所示:
在此示例代码中,文件的前10行具有与之前相同的内容。第12行的第二个函数创建并返回一些示例数据,第17行的第三个函数模拟将修改后的数据写入数据库。
第21行定义了main()函数。在此示例中,对main()做出修改,它将调用数据读取,数据处理以及数据写入等功能。
首先,从read_data_from_web()中创建data。将data作为参数传入process_data(),之后将返回modified_data。最后,将modified_data传入write_data_to_database()。
脚本的最后两行是条件语块用于验证__name__,并且如果if语句为True,则执行main()。
在命令行中运行如下所示:
根据执行结果,Python解释器在执行main()函数时,将依次执行read_data_from_web(),process_data()以及write_data_to_database()。当然,您也可以导入best_practices.py文件并重用process_data()作为不同的数据输入源,如下所示:
在此示例中,导入了best_practices并且将其简写为bp。
导入过程会导致Python解释器执行best_practices.py的全部代码,因此输出显示解释文件用途的信息。
然后,从文件中存储数据而不是从Web中读取数据。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函数。在此情况下,可以利用代码重写来取代在main()函数中实现全部的代码逻辑。
实践总结
以下是Python中main()函数的四个关键最佳实践:
结论
恭喜!您现在已经了解如何创建Python main()函数了。
本文介绍了如下内容:
现在,您可以开始编写一些非常棒的关于Python main()函数代码啦!
Ⅳ python怎么编写函数
在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回
def 函数名([参数1,参数2,...,参数n]):
函数体
函数代码以def关键词开头,后接函数标识符名称和圆括号():
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
函数的第一行语句可以选择性的使用文档字符串-用于存放函数说明
函数内容以冒号起始,并且缩进
return[表达式]结束函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None
Ⅳ python中的函数是什么
Python3 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号:起始,并且缩进。
return [表达式]结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
语法
Python 定义函数使用 def 关键字,一般格式如下:
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
实例
让我们使用函数来输出"Hello World!":
#!/usr/bin/python3
defhello():
print("Hello World!")
hello()
更复杂点的应用,函数中带上参数变量:
实例(Python 3.0+)
比较两个数,并返回较大的数:
#!/usr/bin/python3
def max(a, b): if a > b: return a
else: return b
a = 4b = 5print(max(a, b))
以上实例输出结果:
实例(Python 3.0+)
计算面积函数:
#!/usr/bin/python3
# 计算面积函数def area(width, height): return width * height
def print_welcome(name): print("Welcome", name)
print_welcome("Runoob")w = 4h = 5print("width =", w, " height =", h, " area =", area(w, h))
以上实例输出结果:
函数调用
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
如下实例调用了printme()函数:
实例(Python 3.0+)
#!/usr/bin/python3
# 定义函数def printme( str ): # 打印任何传入的字符串
print (str)
return
# 调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")
以上实例输出结果:
参数传递
在 python 中,类型属于对象,变量是没有类型的:
以上代码中,[1,2,3]是 List 类型,"Runoob"是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值a=5后再赋值a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
可变类型:变量赋值la=[1,2,3,4]后再赋值la[2]=5则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 C++ 的值传递,如 整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a))内部修改 a 的值,则是新生成来一个 a。
可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
python 传不可变对象实例
通过id()函数来查看内存地址变化:
实例(Python 3.0+)
def change(a): print(id(a)) # 指向的是同一个对象
a=10
print(id(a)) # 一个新对象
a=1print(id(a))change(a)
以上实例输出结果为:
可以看见在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id。
传可变对象实例
可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def changeme( mylist ): "修改传入的列表"
mylist.append([1,2,3,4])
print ("函数内取值: ", mylist)
return
# 调用changeme函数mylist = [10,20,30]changeme( mylist )print ("函数外取值: ", mylist)
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
参数
以下是调用函数时可使用的正式参数类型:
必需参数
关键字参数
默认参数
不定长参数
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
实例(Python 3.0+)
#!/usr/bin/python3
#可写函数说明def printme( str ): "打印任何传入的字符串"
print (str)
return
# 调用 printme 函数,不加参数会报错printme()
以上实例输出结果:
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
以下实例在函数 printme() 调用时使用参数名:
实例(Python 3.0+)
#!/usr/bin/python3
#可写函数说明def printme( str ): "打印任何传入的字符串"
print (str)
return
#调用printme函数printme( str = "菜鸟教程")
以上实例输出结果:
以下实例中演示了函数参数的使用不需要使用指定顺序:
实例(Python 3.0+)
#!/usr/bin/python3
#可写函数说明def printinfo( name, age ): "打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数printinfo( age=50, name="runoob" )
以上实例输出结果:
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
实例(Python 3.0+)
#!/usr/bin/python3
#可写函数说明def printinfo( name, age = 35 ): "打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数printinfo( age=50, name="runoob" )print ("------------------------")printinfo( name="runoob" )
以上实例输出结果:
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:
加了星号*的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ): "打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vartuple)
# 调用printinfo 函数printinfo( 70, 60, 50 )
以上实例输出结果:
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ): "打印任何传入的参数"
print ("输出: ")
print (arg1)
for var in vartuple: print (var)
return
# 调用printinfo 函数printinfo( 10 )printinfo( 70, 60, 50 )
以上实例输出结果:
还有一种就是参数带两个星号**基本语法如下:
加了两个星号**的参数会以字典的形式导入。
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, **vardict ): "打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vardict)
# 调用printinfo 函数printinfo(1, a=2,b=3)
以上实例输出结果:
声明函数时,参数中星号*可以单独出现,例如:
如果单独出现星号*后的参数必须用关键字传入。
匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda 函数的语法只包含一个语句,如下:
如下实例:
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数print ("相加后的值为 : ", sum( 10, 20 ))print ("相加后的值为 : ", sum( 20, 20 ))
以上实例输出结果:
return语句
return [表达式]语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:
实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def sum( arg1, arg2 ): # 返回2个参数的和."
total = arg1 + arg2
print ("函数内 : ", total)
return total
# 调用sum函数total = sum( 10, 20 )print ("函数外 : ", total)
以上实例输出结果:
强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
以下使用方法是正确的:
以下使用方法会发生错误:
Ⅵ python自定义函数有哪些
Python的自定义函数格式中规中矩,用def引导自定义函数名,用括号给出该函数的参数,在冒号后换行通过缩进确定函数体。在格式上和条件判断语句有些相似。
如果函数名和变量名冲突了,相当于重新赋值。而python解释是从上到下的,也就是说此时谁在下面谁占用这个变量名。剩下的那个就只能在内存中等待垃圾回收了。
自定义函数的参数:
按道理来说,即使Python不严格要求定义函数参数,但这方面的知识有助于理解自定义函数中参数操作的情况,还是应该说明一下的。
可以简单地理解为在定义函数时括号中声明的参数是我们在函数使用中会用到的参数,在调用函数时括号中的变量就是参加函数运算用到的变量,换个名字参数(用于定义)和变量(用于调用)就足以理解了。
Ⅶ python中定义函数的关键字
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
可以定义一个由自己想要功能的函数,以下是简单的规则:
1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法
Python 定义函数使用 def 关键字,一般格式如下:
1
2
def 函数名(参数列表):
函数体
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
示例
让我们使用函数来输出"Hello World!":
1
2
>>>def hello() :
print("Hello World!")
输出结果
>>> hello()
Hello World!
Ⅷ python中创建自定义函数的关键字
打开IDLE python GUI,点击开始-所有程序-python2.7-IDLE python GUI,或者直接进入dos环境,或者其他的IDLE。
Ⅸ python中定义函数的关键字是什么
python中定义函数的关键字是def。
Python使用def关键字开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有返回值, 在expressions中的逻辑代码中用return返回。
上面我们定义了一个名字为 function 的函数,函数没有不接受参数,所以括号内部为空,紧接着就是 函数的功能代码。
如果执行该脚本,发现并没有输出任何输出,因为我们只定义了函数,而并没有执行函数。 这时我们在Python命令提示符中输入函数调用 function(), 注意这里调用函数的括号不能省略。
python的学习
如果我们用代码实现了一个小功能,但想要在程序代码中重复使用,不能在代码中到处粘贴这些代码,因为这样做违反了软件工程中DRY原则。 Python提供了函数功能,可以将我们这部分功能抽象成一个函数以方便程序调用,或者提供给其他模块使用。
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。(推荐学习:Python视频教程)函数必须先定义,才能调用,否则会报错,无参数时函数的调用函数名()。
有参数时函数的调,不要在定义函数的时候在函数体里面调用本身,否则会出不来,陷入循环调用,函数需要调用函数体才会被执行,单纯的只是定义函数是不会被执行的。
Ⅹ Python中定义函数的使用方法
4.6. 定义函数
我们可以创建一个用来生成指定边界的斐波那契数列的函数:
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
关键字 def 引入了一个函数 定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。
函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring。(更多关于 docstrings 的信息请参考 文档字符串) 有些工具通过 docstrings 自动生成在线的或可打印的文档,或者让用户通过代码交互浏览;在你的代码中包含 docstrings 是一个好的实践,让它成为习惯吧。
函数 调用 会为函数局部变量生成一个新的符号表。确切的说,所有函数中的变量赋值都是将值存储在局部符号表。变量引用首先在局部符号表中查找,然后是包含函数的局部符号表,然后是全局符号表,最后是内置名字表。因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。
函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。[1] 一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。
一个函数定义会在当前符号表内引入函数名。函数名指代的值(即函数体)有一个被 Python 解释器认定为 用户自定义函数 的类型。 这个值可以赋予其他的名字(即变量名),然后它也可以被当作函数使用。这可以作为通用的重命名机制:
>>> fib
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
如果你使用过其他语言,你可能会反对说:fib 不是一个函数,而是一个方法,因为它并不返回任何值。事实上,没有 return 语句的函数确实会返回一个值,虽然是一个相当令人厌烦的值(指 None )。这个值被称为 None (这是一个内建名称)。如果 None 值是唯一被书写的值,那么在写的时候通常会被解释器忽略(即不输出任何内容)。如果你确实想看到这个值的输出内容,请使用 print() 函数: