何も行わない空の関数を定義したい場合は、pass
ステートメントを使用できます: pass
语句:
1 |
|
pass
语句什么都不做,那有什么用?实际上pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来。
pass
还可以用在其他语句里,比如if
定义函数时,需要确定函数名和参数个数;
如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用return
随时返回函数结果;
函数执行完毕也没有return
语句时,自动return None
。
函数可以同时返回多个值,但其实就是一个tuple。
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
*nums
表示把nums
这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
关键字参数有什么用?它可以扩展函数的功能。比如,在person
函数里,我们保证能接收到name
和age
这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:
1 2 |
|
当然,上面复杂的调用可以用简化的写法:
1 2 |
|
**extra
表示把extra
这个dict的所有key-value用关键字参数传入到函数的**kw
参数,kw
将获得一个dict,注意kw
获得的dict是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
。
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。
仍以person()
函数为例,我们希望检查是否有city
和job
参数
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city
和job
作为关键字参数。这种方式定义的函数如下:
1 |
|
和关键字参数**kw
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
调用方式如下:
1 2 |
|
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了:
1 |
|
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:
1 2 3 |
|
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
比如定义一个函数,包含上述若干种参数:
1 |
|
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
1 2 3 4 5 6 |
|
最神奇的是通过一个tuple和dict,你也可以调用上述函数:
1 2 3 |
|
所以,对于任意函数,都可以通过类似func(*args, **kw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
pass
ステートメントは何も行わないので、何の役に立つのでしょうか?実際、pass
はプレースホルダーとして使用できます。たとえば、関数コードの書き方がまだわかっていない場合は、最初に pass
を置くことができます。コードが実行できること。
pass
は、if などの他のステートメントでも使用できます概要関数を定義するときは、関数名とパラメーターの数を決定する必要があります。必要に応じて、最初にパラメータのデータ型を決定します。チェックを実行します。🎜🎜関数が実行され、return を使用できます。 code>return ステートメントを実行すると、自動的に return None
が返されます。 🎜🎜この関数は同時に複数の値を返すことができますが、実際にはタプルです。 🎜🎜🎜🎜変数パラメーター🎜🎜 Python 関数では、変数パラメーターを定義することもできます。名前が示すように、可変パラメーターは、渡されるパラメーターの数が可変であり、1、2、または任意の数、または 0 の可能性があることを意味します。 🎜🎜*nums
は、nums
リストのすべての要素を変数パラメーターとして渡すことを意味します。この書き方は非常に便利で、非常に一般的です。 🎜🎜キーワード パラメーター🎜🎜 変数パラメーターを使用すると、関数が呼び出されるときに、0 または任意の数のパラメーターを渡すことができます。キーワード パラメーターを使用すると、パラメーター名を含むパラメーターを 0 個または任意の数で渡すことができ、これらのキーワード パラメーターは関数内の dict に自動的にアセンブルされます。 🎜🎜キーワードパラメータは何に使用されますか?関数の機能を拡張できます。たとえば、person
関数では、呼び出し元が希望する場合は、2 つのパラメータ name
と age
を受け取ることが保証されます。さらにパラメータを受け取ることもできます。ユーザー登録機能を実行していると想像してください。ユーザー名と年齢は必須ですが、それ以外はすべてオプションです。キーワード パラメーターを使用してこの機能を定義すると、登録のニーズを満たすことができます。 🎜🎜変数パラメーターと同様に、最初に辞書を組み立ててから、その辞書をキーワード パラメーターに変換して渡すこともできます: 🎜
🎜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
🎜
1 2 3 |
|
**extra
は、extra のすべての Key-Value を意味します
dict キーワード引数を使用して関数の **kw
パラメータに渡します。kw
は kw によって取得された dict を取得します。
は extra
のコピーです。kw
への変更は関数外の extra
には影響しません。 🎜🎜 🎜🎜名前付きキーワード パラメーター🎜🎜 キーワード パラメーターの場合、関数の呼び出し元は無制限のキーワード パラメーターを渡すことができます。何が渡されるかについては、関数内の kw
を通じて確認する必要があります。 🎜🎜引き続き person()
関数を例として、city
パラメータと job
パラメータがあるかどうかを確認したいと思います🎜🎜必要に応じてキーワード パラメータの名前を制限するには、名前付きキーワード パラメータを使用できます。たとえば、キーワード パラメータとして city
と job
のみを受け取ります。この方法で定義された関数は次のとおりです: 🎜
🎜
1 |
|
**kw
とは異なり、名前付きキーワード パラメータには特別な区切り文字が必要です* と *
は、名前付きキーワード パラメータとして扱われます。 🎜🎜呼び出しメソッドは次のとおりです: 🎜
🎜
1 2 3 4 |
|
🎜
1 2 3 4 5 |
|
🎜
1 |
|
🎜
1 2 3 4 5 6 |
|
🎜
1 |
|
🎜
1 |
|
func(*args, **kw)
に似た形式で呼び出すことができます。そのパラメータは次のように定義されています。 🎜🎜🎜概要🎜🎜Python の関数には非常に柔軟なパラメータ形式があり、単純な呼び出しを実装できるだけでなく、非常に複雑なパラメータを渡すこともできます。 🎜🎜デフォルトパラメータは不変オブジェクトを使用する必要があります。変数オブジェクトの場合、プログラムの実行時にロジックエラーが発生します。 🎜🎜可変引数パラメーターとキーワード パラメーターを定義するための構文に注意してください:🎜*args
是可变参数,args接收的是一个tuple;
**kw
是关键字参数,kw接收的是一个dict。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
;
关键字参数既可以直接传入:func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。
使用*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*
,否则定义的将是位置参数。
注:查看详细猛击这里
文件操作函数
open函数,该函数用于文件处理
操作文件时,一般需要经历如下步骤:
打开文件
操作文件
一、打开文件
文件句柄
=
open
(
'文件路径'
,
'模式'
)
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
python 2.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
python3.0
三、管理上下文
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
1 2 3 |
|
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
1 |
|
学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:
1 2 3 4 |
|
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
1 2 3 4 5 |
|
lambda存在意义就是对简单函数的简洁表示!
1 |
|
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000)
:
1 2 3 4 5 6 |
|
解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
上面的fact(n)
函数由于return n * fact(n - 1)
引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:
1 |
|
可以看到,return fact_iter(num - 1, num * product)
仅返回递归函数本身,num - 1
和num * product
在函数调用前就会被计算,不影响函数调用。
fact(5)
对应的fact_iter(5, 1)
的调用如下:
1 |
|
尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)
函数改成尾递归方式,也会导致栈溢出。
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
1 2 3 4 5 |
|
以上がPython関数の使い方まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。