【ディープラーニング】PythonとNumPyチュートリアルシリーズ(7): Python関数

目次

I.はじめに

2. 実験環境

3. Python関数の基礎

1. 関数の定義

2. パラメータの受け渡し

3. 関数呼び出し

4. 戻り値

5. 関数ドキュメント文字列

4. 関数をモジュールに格納する

1. モジュールの作成

2.インポートモジュール

a. インポートモジュール名

b. モジュール名インポート関数名から

c. モジュール名 import * から

5. 各種機能

1. 通常の機能

2.匿名関数(Lambda関数)

3. 内蔵機能

4. 再帰関数

a. 再帰的な概念

b. 再帰的条件

5. 高次関数

6. デコレータ機能

7. ジェネレーター機能

8. 非同期関数

9. 部分的な機能


I.はじめに

        Python は、1991 年に Guido van Rossum によって作成された高級プログラミング言語です。簡潔で読みやすい構文で有名で、強力な機能と幅広い応用分野を備えています。Python には、Web 開発、データ分析、人工知能、科学技術コンピューティング、自動化スクリプトなど、さまざまな種類のアプリケーションの開発に使用できる標準ライブラリとサードパーティ ライブラリが豊富にあります。

        Python 自体は優れた汎用プログラミング言語であり、いくつかの人気のあるライブラリ (numpy、scipy、matplotlib) の助けを借りて、科学技術コンピューティングのための強力な環境となっています。このシリーズでは、Python プログラミング言語と、主に次のような科学技術計算に Python を使用する方法を紹介します。

  • Python: 基本的なデータ型、コンテナー (リスト、タプル、セット、辞書)、関数、クラス
  • Numpy: 配列、配列のインデックス付け、データ型、配列の演算、ブロードキャスト
  • Matplotlib: プロット、サブプロット、画像
  • IPython: ノートブックの作成、典型的なワークフロー

2. 実験環境

しこり 1.21.6
パイソン 3.7.16
  • 次のコマンドを実行して Python のバージョンを確認します。
 python --version 
  • 次のコードを実行して、Python と NumPy のバージョンを確認します。
import sys
import numpy as np

print("Python 版本:", sys.version)
print("NumPy 版本:", np.__version__)

3. Python関数の基礎

        Python 関数は、特定のタスクを実行する再利用可能なコード ブロックを指します。関数は入力パラメータ (オプション) を受け入れ、出力結果 (これもオプション) を返します。Python 関数には次の重要な機能があります。

1. 関数の定義

        キーワードを使用してdef関数を定義します。関数定義には、関数名、パラメータ リスト、関数本体が含まれます。

def add_numbers(a, b):
    sum = a + b
    return sum

        上記のコードは、add_numbers2 つのパラメーターを受け取りabそれらの合計を返す という名前の関数を定義します。

2. パラメータの受け渡し

        関数は 0 個以上の引数を受け入れることができます。パラメーターは必須 (必須) またはオプション (省略可能) の場合があります。関数は呼び出されたときにパラメーターを介して入力値を受け取ります。

def greet(name):
    print("Hello, " + name + "!")

        上記のコードは、greetという名前のパラメータを受け取りname、挨拶を出力する という名前の関数を定義しています。

3. 関数呼び出し

        関数を呼び出すには、関数名と対応する引数リストを使用します。

result = add_numbers(3, 4)
print(result)

        上記のコードはadd_numbers関数を呼び出し、返された結果をresult変数に代入し、結果を出力します。

4. 戻り値

return関数はステートメントを使用して値を返すこと        ができます。戻り値は、数値、文字列、リストなど、任意のタイプのオブジェクトにすることができます。

def multiply_numbers(a, b):
    product = a * b
    return product

        上記のコードは、 2 つの引数を受け取り、その積を返すmultiply_numberssum という関数を定義していますab

5. 関数ドキュメント文字列

        他の開発者が関数の目的と使用法を理解しやすくするために、関数内のコメントにドキュメント文字列 (docstring) を使用できます。docstring は関数定義に続く文字列で、help()関数または.__doc__プロパティを通じて表示できます。

def add_numbers(a, b):
    """
    This function adds two numbers and returns the result.
    """
    sum = a + b
    return sum


help(add_numbers)

print(add_numbers.__doc__)

        

4. 関数をモジュールに格納する

1. モジュールの作成

        新しい Python ファイルを作成し、目的のモジュール名 (例my_module.py: ) を付けます。このファイルでは、関数およびその他の関連コードを定義します。

def add_numbers(a, b):
    return a + b

def multiply_numbers(a, b):
    return a * b

# 其他函数和代码...

        ファイルを保存し、Python インタープリターがアクセスできる場所に置きます。通常、モジュール ファイルは、それを呼び出すコード ファイルと同じディレクトリに配置できます。

2.インポートモジュール

        関数をモジュールに保存すると、コードの編成と再利用性が向上します。モジュールは、関連する機能をまとめてカプセル化する方法であり、プロジェクト内の複数のファイルで使用でき、他の開発者と共有して再利用できます。

a. import 模块名

        別の Python スクリプトで、importステートメントを使用して、作成したモジュールをインポートします。

import my_module

result = my_module.add_numbers(3, 5)
print(result)  # 输出:8

result = my_module.multiply_numbers(2, 4)
print(result)  # 输出:8

        ステートメントを介してモジュールをインポートするとimport、モジュール内で定義された関数やその他のコードを使用できるようになります。模块名.函数名モジュール内の関数は次の方法で呼び出すことができます。

b. from 模块名 import 函数名

        使用されるフォームはfrom 模块名 import 函数名、モジュール名をプレフィックスとして使用せずに、関数名を使用して直接呼び出すことができます。    

from my_module import add_numbers

result = add_numbers(3, 5)
print(result)  # 输出:8

        このようにして、モジュール内の特定の関数または変数を選択的にインポートして、より便利に使用できます。

c. from 模块名 import *

        使用されるメソッドでfrom 模块名 import *は、モジュール内のすべての関数と変数をインポートできます。このインポート メソッドは、モジュール内のすべてのパブリック (アンダースコアで始まらない) 関数と変数を現在の名前空間にインポートします。

from 模块名 import *ただし、特に大規模なプロジェクトでは、.py を使用してモジュールをインポートし        ないことをお勧めします。これは、このアプローチでは名前空間の汚染や名前の競合が発生する可能性があるためです。インポートされたモジュールに、現在の名前空間と同じ名前の関数または変数が複数ある場合、名前の競合が発生し、予期しない動作が発生する可能性があります。

from 模块名 import 函数名代わりに、またはフォーム        を使用して明示的にインポートすることをお勧めしますimport 模块名これにより、インポートする関数やモジュールを明示的に指定できるようになり、使用時にソースが明確になります。

        モジュール内のすべての関数と変数を本当にインポートする必要がある場合は、import 模块名メソッドを使用してモジュール全体をインポートし、模块名.函数名メソッドを使用してそれらを呼び出すことができます。これにより、名前の競合が回避され、コードの意図がより明確に表現されます。

5. 各種機能

1. 通常の機能

        通常の関数は、パラメータと戻り値を受け入れることができる、キーワードによって定義される関数の最も一般的な形式ですdef

def add_numbers(a, b):
    return a + b

result = add_numbers(3, 5)
print(result)  # 输出:8

2.匿名関数(Lambda関数)

        匿名関数 (ラムダ関数) は、関数名のない単純な関数形式です。これは通常、一度定義して使用する必要がある単純な関数に使用されます。匿名関数lambdaはキーワードを使用して定義され、関数本体として 1 つ以上のパラメーターと式を含めることができます。無名関数を使用して 2 つの数値の合計を計算する例を次に示します。

add_numbers = lambda a, b: a + b
result = add_numbers(3, 5)
print(result)  # 输出:8

3. 内蔵機能

        Python には多くの組み込み関数が用意されています。これらの組み込み関数は、 Python インタープリターによって提供される事前定義関数であり、直接使用できます。これらの組み込み関数には、さまざまな一般的な操作を実行するために使用されるlen()print()range()type()などが含まれます。一般的に使用される組み込み関数の例をいくつか示します。

# 获取字符串长度
length = len("Hello, world!")
print(length)  # 输出:13

# 打印文本
print("Hello, world!")

# 生成整数序列
numbers = list(range(1, 6))
print(numbers)  # 输出:[1, 2, 3, 4, 5]

# 获取对象类型
print(type(numbers))  # 输出:<class 'list'>

4. 再帰関数

a. 再帰的な概念

        関数の再帰は、関数がその関数本体内でそれ自体を呼び出すプロセスです。再帰関数には通常、基本ケースと再帰ケースの 2 つの部分があります。

  • 基本ケースとは、関数が再帰を停止する条件です。基本ケースが満たされると、再帰関数はそれ自体を呼び出すのではなく、特定の値を返すか、他の操作を実行します。
  • 再帰的状況とは、関数がそれ自体を再帰的に呼び出し続ける状態です。再帰の場合、関数はさまざまなパラメーター値を渡すことで、より小さな問題を解決します。問題のサイズを継続的に縮小すると、最終的に基本ケースに到達し、再帰が終了します。

b. 再帰的条件

再帰関数は、次の 2 つの重要な条件を満たす必要があります。

  • 基本ケース: 再帰を終了し、特定の値を返すか、特定の操作を実行する基本ケースが 1 つ以上存在する必要があります。

  • 収束: 再帰呼び出しは基本ケースに近似する必要があります。つまり、各再帰呼び出しにおいて、問題のサイズは前の再帰呼び出しよりも小さくなり、最終的には基本ケースに到達する必要があります。

        再帰関数が基本ケースを正しく定義していないか、収束に失敗すると、無限再帰が発生し、最終的にはスタック オーバーフローやプログラムのクラッシュにつながります。再帰関数は、特定の状況において簡潔で洗練されたソリューションを提供できます。ただし、再帰的実行は反復 (ループ) よりも多くのメモリと時間を消費するため、再帰を使用する場合は問題のサイズとパフォーマンスに注意する必要があります。

        以下は、正の整数の階乗を計算する再帰関数の典型的な例です。

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

result = factorial(5)
print(result)  # 输出:120

        上記のコードでは、n再帰関数は、0 に等しい場合に基本ケースとして 1 を返します。それ以外の場合、再帰関数は再帰的な場合としてnと の積を計算します。factorial(n - 1)

5. 高次関数

        高階関数は、関数をパラメーターとして受け取ったり、関数を返したりできる関数の形式です。Python では、関数は第一級の市民であるため、他のオブジェクトと同様に受け渡したり操作したりできます。高階関数を使用して、組み合わせ、フィルタリング、マッピングなどの機能を実装できます。たとえば、map()および は、filter()反復可能なオブジェクトのマッピングおよびフィルタリング操作に使用される一般的な高階関数です。map()sumを使用したfilter()を次に示します。

numbers = [1, 2, 3, 4, 5]

# 使用map()函数将每个数平方
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)  # 输出:[1, 4, 9, 16, 25]

# 使用filter()函数过滤出偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出:[2, 4]

        上の例では、map()関数は各数値を 2 乗し、それをlambda x: x**2マッピング関数として使用します。filter()この関数は偶数を除外し、lambda x: x % 2 == 0フィルター関数として使用されます。

6. デコレータ機能

  • デコレータ関数は、他の関数の動作や機能を変更するために使用される特別な関数です。
    • デコレーター関数は通常、関数を入力として受け入れ、新しい関数を出力として返します。
    • デコレータ関数は、元の関数コードを変更せずに機能を追加することで関数の動作を拡張します。
  • 以下は、関数呼び出しの前後にログを出力する単純なデコレーター関数です。
def logger(func):
    def wrapper(*args, **kwargs):
        print("Calling function:", func.__name__)
        result = func(*args, **kwargs)
        print("Function", func.__name__, "finished execution")
        return result
    return wrapper

@logger
def add_numbers(a, b):
    return a + b

result = add_numbers(3, 5)
print(result)  # 输出:8

        上記の例では、loggerデコレータ関数は関数を入力として受け入れ、新しい関数を返しますwrapperwrapperこの関数は、装飾された関数の呼び出しの前後にログ情報を出力します。

7. ジェネレーター機能

  • ジェネレーター関数は、ジェネレーターの定義に使用できる特別な関数です。
    • ジェネレーターは、値を一度に生成するのではなくオンデマンドで生成する特別な種類の反復子です。
    •  ジェネレーター関数は、yieldキーワードを使用してジェネレーターの各要素を定義します。
    • ジェネレーターのnext()関数が呼び出されるか、forループを使用して反復されるたびに、ジェネレーター関数は最後に一時停止した場所から実行を再開し、次の値を生成します。
    • このオンデマンドの値の生成により、パフォーマンスが向上し、メモリが節約されます。
  • 以下は、フィボナッチ数列を生成するジェネレーター関数です。
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci_generator()
print(next(fib))  # 输出:0
print(next(fib))  # 输出:1
print(next(fib))  # 输出:1
print(next(fib))  # 输出:2
# ...

# 使用for循环打印斐波那契数列的前十个数
fib = fibonacci_generator()
for _ in range(10):
    print(next(fib))

        上の例では、fibonacci_generatorジェネレーター関数yieldキーワードは、フィボナッチ数列を生成するジェネレーターを定義します。next(fib)呼び出されるたびに、ジェネレーターはフィボナッチ数列の次の値を生成します

8. 非同期関数

asyncasync 関数は、キーワード        を使用して定義できる非同期プログラミングで使用される関数の形式です非同期関数は、通常、ネットワーク要求、ファイルの読み取りと書き込みなどの非同期操作を処理するawaitキーワードとともに使用されます。非同期関数を使用すると、プログラムの同時実行パフォーマンスと応答性が向上し、特定の操作が完了するまで待機している間に他のタスクを実行できるようになります。単純な非同期関数の例を次に示します。

import asyncio

async def greet(name):
    print("Hello, " + name)
    await asyncio.sleep(1)
    print("Goodbye, " + name)

asyncio.run(greet("Alice"))

        上記の例では、greetasync 関数はawaitキーワード「非同期操作が完了するまで待機」を使用しますasyncio.sleep(1)待機中に他のタスクを実行できます。このような非同期関数により、I/O 操作を待機しているときのプログラムのパフォーマンスが向上します。

9. 部分的な機能

        部分関数は、関数の一部のパラメータを固定する関数形式です。これは、functools.partial()関数を使用して、元の関数のパラメーターの一部を修正する新しい関数を作成することで機能します。部分関数を使用すると、関数呼び出しを簡素化し、コードの繰り返しを減らすことができます。部分関数を使用した例を次に示します。

import functools

def power(base, exponent):
    return base ** exponent

square = functools.partial(power, exponent=2)
cube = functools.partial(power, exponent=3)

print(square(4))  # 输出:16,等同于 power(4, 2)
print(cube(4))  # 输出:64,等同于 power(4, 3)

        上記の例では、functools.partial()関数は 2 つの新しい部分関数squareとを作成しますcube。これらは、パラメーターが 2 と 3 に固定されているpower関数の特定のバージョンです。exponent

おすすめ

転載: blog.csdn.net/m0_63834988/article/details/132790623