Pythonで変数に関数を代入する際の問題点について詳しく解説していますのでご注意ください。

黄舟
リリース: 2017-08-20 10:50:57
オリジナル
2180 人が閲覧しました

変数の割り当ては、Python で関数を変数に割り当てるときに注意する必要がある問題を中心に、サンプルコードを通じて詳しく紹介しています。必要な方はぜひ参考にして学習してください。以下をご覧ください。

はじめに

この記事では主に、Python で関数を変数に割り当てるときに注意する必要があるいくつかの問題を紹介します。これは、参照と学習のために共有されます。以下では多くを述べません。詳細を見てください。 はじめに:

関数を変数に代入する 2 つの形式を見てきました。1 つは


a=f
ログイン後にコピー

で、もう 1 つは


a=f()
ログイン後にコピー

です。これら 2 つの形式は異なります。要約しましょう。それぞれ。

1. a=f タイプは、変数を関数に指すことを指します。

コードで確認してください:


>>> f = abs
>>> f(-10)
10
ログイン後にコピー

変数 f が abs 関数自体を指していることを説明します。 abs() 関数を直接呼び出すことは、変数 f() を呼び出すこととまったく同じです。これは、Liao Xuefeng 先生の Python チュートリアルの例です。f() を呼び出すことは、abs() を呼び出すことと同じです。 abs()函数和调用变量f()完全相同。这是廖雪峰老师python教程上的例子,现在调用f()和调用abs()是一样的了。

再举一个工厂函数的例子:


def maker(N):

  def action(X):

    return X**N

  return action
ログイン後にコピー

这个嵌套函数的外层返回值为内层函数的函数名,注意没有括号,这里有无括号是有很大区别的。此时调用外部函数:


f=maker(2)
ログイン後にコピー

那么如上所述,f便指向了action函数,且限制条件为N=2,可以理解为f为N等于2时的action函数。我们来调用它:


>>> f(3)
9
ログイン後にコピー

证明f和action函数是一样的。

2.a=f()型属于将f()的返回值赋值给a的过程

这里的a仅仅接收f()的返回值,如果f()没有返回值,那么a即被赋值为None。这里值得注意的一点是,在a=f()的执行过程中,f()会运行一次,这也是我刚刚搞明白的,如:


>>> def add(x,y):
    z=x+y
    print(z)
>>>a=add(3,4)
7
ログイン後にコピー

这里虽然只有一个赋值语句执行了,但是却输出了结果7,说明赋值过程函数add执行了,然而a的值为None,且只能通过print语句才可以显示。不只是赋值过程函数会执行,写在return语句中也会如此。


>>>def log(func):
   def wrapper(*args, **kw):
     print('call %s():' % func.__name__)
     return func(*args, **kw)
   return wrapper
>>>@log
>>>def now():
    print('2015-3-25')
ログイン後にコピー

这是廖雪峰老师python教程装饰器一节的例程,刚开始我以为return func(*args,**kw)这个语句是返回了now()函数(即func函数)的返回值,后来发现now函数没有返回值,即为None,所以其实是这个语句在赋值过程,

func(*args,**kw)执行了,即函数now的print语句执行了。

下面的习题中,一个变形是要求在函数调用的前后打印出'begin call'和'end call',下面一位网友的程序是这么写的:


def wrapper(*args,**kw):
   print(t+'begin call')
   result=func(*args,**kw)
   print(t+'end call')
   return result
ログイン後にコピー

开始不太理解为什么使用result=func(*args,**kw)

ファクトリー関数の別の例:

def wrapper(*args,**kw):
   print(t+'begin call')
   func(*args,**kw)
   print(t+'end call')
ログイン後にコピー
このネストされた関数の外側の戻り値は、括弧が存在しないことに注意してください。か否か。このとき、外部関数は rrreee🎜 と呼ばれます。 前述したように、f はアクション関数を指し、制約条件は N=2 です。 N が等しいときの f はアクション関数であることがわかります。 2へ。それを呼び出しましょう: 🎜🎜🎜🎜rrreee🎜 f 関数と action 関数が同じであることを証明します。 🎜🎜🎜🎜2.a=f() 型は、f() の戻り値を a🎜🎜🎜🎜 に代入するプロセスに属し、ここで a は f() の戻り値のみを受け取ります。 f() に戻り値がない場合、 a には値 None が割り当てられます。ここで注目すべき点の 1 つは、a=f() の実行中に f() が 1 回実行されることです。これは、次のようなものです。 🎜🎜🎜rrreee🎜ここでは代入文は1つだけ実行されていますが、代入処理関数addが実行されたことを示す結果7が出力されますが、aの値はNoneとなりprint文でのみ表示できます。代入手続き関数だけでなく、その中に書かれた return 文も実行されます。 🎜🎜🎜🎜rrreee🎜これは、Liao Xuefeng 先生の Python チュートリアルのデコレータ セクションのルーチンです。最初は、ステートメント return func(*args,**kw)now を返すのだと思いました。 ()関数 (つまり func 関数) の戻り値。後で、now 関数には戻り値がないことが判明しました。これは None なので、このステートメントは実際には代入プロセスにあります 🎜🎜 func(*args,**kw ) が実行されます。つまり、 function now の print ステートメントが実行されます。 🎜🎜次の演習では、関数呼び出しの前後に「呼び出し開始」と「呼び出し終了」を出力するバリエーションがあります。以下のネチズンが書いたプログラムは次のようなものです。 🎜🎜🎜🎜rrreee🎜私はしませんでした。理由は最初はよくわかりましたが、 result=func(*args,**kw) という文を使用します。後で理解すると、この文自体も意味がないことがわかりました。 func 関数を実行させるので、 🎜🎜🎜 🎜rrreee🎜 と記述されます。結果は同じです。 🎜🎜🎜🎜概要🎜🎜🎜

以上がPythonで変数に関数を代入する際の問題点について詳しく解説していますのでご注意ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート