アリババクラウドパイソントレーニングキャンプTASK3-DAY1
前書き
Pythonは関数をオブジェクトとして扱い、別の関数から返して高次の関数を作成できます。たとえば、パラメーターは関数であり、戻り値は関数です。
1つ、機能
1.関数の定義と呼び出し
関数定義:
-
関数はdefキーワードで始まり、関数名と括弧()が続きます。
-
関数によって実行されるコードはコロンで始まり、インデントされます。
-
return [expression]関数を終了し、オプションで呼び出し元に値を返します。式なしで返すことは、Noneを返すことと同じです。
def functionname (parameters): "函数_文档字符串" function_suite return [expression]
関数呼び出し:
デモコードは次のとおりです。
def printme(str):
print(str)
printme("我要调用用户自定义函数!") # 我要调用用户自定义函数!
printme("再次调用同一函数") # 再次调用同一函数
temp = printme('hello') # hello
print(temp) # None
3.機能のドキュメント
デモコードは次のとおりです。
def MyFirstFunction(name):
"函数定义过程中name是形参"
# 因为Ta只是一个形式,表示占据一个参数位置
print('传递进来的{0}叫做实参,因为Ta是具体的参数值!'.format(name))
MyFirstFunction('老马的程序人生')
# 传递进来的老马的程序人生叫做实参,因为Ta是具体的参数值!
4.機能パラメータ
Python関数には、非常に柔軟で多様なパラメーター形式があり、単純な呼び出しを実現し、非常に複雑なパラメーターを渡すことができます。単純なものから複雑なものまでのパラメーター形式は次のとおりです。
- 位置論
- デフォルトの引数
- 可変引数
- キーワード引数
- 名前キーワード引数
- パラメータの組み合わせ
(1)位置パラメータ
def functionname(arg1):
"函数_文档字符串"
function_suite
return [expression]
arg1-positionalパラメーター。これらのパラメーターは、関数を呼び出す(関数を呼び出す)ときに位置を固定する必要があります。
(2)。デフォルトパラメータ
def functionname(arg1, arg2=v):
"函数_文档字符串"
function_suite
return [expression]
arg2 = v-デフォルトパラメータ=デフォルト値。関数を呼び出すときに、デフォルトパラメータの値が渡されない場合、それはデフォルト値と見なされます。
デフォルトパラメータは、定位置パラメータの後に配置する必要があります。そうしないと、プログラムはエラーを報告します。
デモコードは次のとおりです。
def printinfo(name, age=19):
print('Name:{0},Age:{1}'.format(name, age))
printinfo('zmt') # Name:zmt,Age:8
printinfo('zmt', 20) # Name:zmt,Age:20
(3)可変パラメータ
名前が示すように、可変パラメーターは、渡されるパラメーターの数が可変であることを意味します。これは、0、1、2から任意の数まで可能であり、可変長のパラメーターです。
def functionname(arg1, arg2=v, *args):
"函数_文档字符串"
function_suite
return [expression]
- args-変数パラメーター(ゼロから任意の数まで)は、自動的にタプルにアセンブルされます。
- アスタリスク(*)が付いた変数名は、名前のないすべての変数パラメーターを格納します。
デモコードは次のとおりです。
def printinfo(arg1, *args):
print(arg1)
for var in args:
print(var)
printinfo(10) # 10
printinfo(70, 60, 50)
#70 60 50
(4)キーワードパラメータ
def functionname(arg1, arg2=v, args, *kw):
"函数_文档字符串"
function_suite
return [expression]
kw-キーワードパラメータ(ゼロから任意の数まで)は、自動的に辞書に組み込まれます。
デモコードは次のとおりです。
def printinfo(arg1, *args, **kwargs):
print(arg1)
print(args)
print(kwargs)
printinfo(70, 60, 50)
# 70
# (60, 50)
# {}
printinfo(70, 60, 50, a=1, b=2)
# 70
# (60, 50)
# {'a': 1, 'b': 2}
変数パラメーターとキーワードパラメーターの類似点と相違点を以下に要約します。
- 可変パラメーターを使用すると、ゼロから任意の数のパラメーターを渡すことができ、関数が呼び出されると、それらは自動的にタプルにアセンブルされます。
- キーワードパラメータを使用すると、ゼロから任意の数のパラメータを渡すことができ、関数内の辞書(dict)に自動的にアセンブルされます。5.名前付きキーワードパラメータ
(5)名前付きキーワードパラメータ
def functionname(arg1, arg2=v, args, *, nkw, *kw):
"函数_文档字符串"
function_suite
return [expression]
- *、nkw-名前付きキーワードパラメータ、ユーザーが入力したいキーワードパラメータ、定義方法は、nkwの前に*区切り文字を追加することです。
- キーワードパラメータの名前を制限したい場合は、「名前付きキーワードパラメータ」を使用できます
- 名前付きキーワードパラメータを使用する場合は、パラメータ名がないことに特に注意してください。
デモコードは次のとおりです。
def printinfo(arg1, *, nkw, **kwargs):
print(arg1)
print(nkw)
print(kwargs)
printinfo(70, nkw=10, a=1, b=2)
# 70
# 10
# {'a': 1, 'b': 2}
printinfo(70, 10, a=1, b=2)
# TypeError: printinfo() takes 1 positional argument but 2 were given
(6)組み合わせパラメータ
Pythonで関数を定義するには、位置パラメータ、デフォルトパラメータ、変数パラメータ、名前付きキーワードパラメータ、およびキーワードパラメータを使用できます。これら5つのパラメータのうち4つを一緒に使用できますが、パラメータ定義の順序は次のとおりである必要があります。
- 位置パラメータ、デフォルトパラメータ、変数パラメータ、およびキーワードパラメータ。
- 位置パラメータ、デフォルトパラメータ、名前付きキーワードパラメータ、およびキーワードパラメータ。
変数パラメーターとキーワードパラメーターを定義するための構文に注意してください。
- * argsは可変パラメーターであり、argsはタプルを受け取ります
- ** kwはキーワードパラメータであり、kwはdictを受け取ります
キーワードパラメータの命名は、呼び出し元が渡すことができるパラメータ名を制限し、デフォルト値を提供することです。名前付きキーワードパラメータを定義するときは、区切り文字*を書くことを忘れないでください。そうしないと、位置パラメータが定義されます。
警告:最大5つのパラメーターを組み合わせることができますが、同時に多くの組み合わせを使用しないでください。そうしないと、機能を理解するのが困難になります。
5.関数の戻り値
Pythonの関数の戻り値は、以前に学習したcおよびjavaと同様です。
def 函数名(参数1,参数2)
return 参数1+参数2
6.変数の範囲
- Pythonでは、プログラムの変数はどの場所からもアクセスできず、アクセス許可は変数が割り当てられている場所によって異なります。
- 関数内で定義された変数には、ローカル変数と呼ばれるローカルスコープがあります。
- 関数の外部で定義された変数には、グローバル変数と呼ばれるグローバルスコープがあります。
- ローカル変数は、それらが宣言されている関数内でのみアクセスできますが、グローバル変数は、プログラム全体のスコープ内でアクセスできます。
デモコードは次のとおりです。
def discounts(price, rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:')) # 98
rate = float(input('请输入折扣率:')) # 0.9
new_price = discounts(old_price, rate)
print('打折后价格是:%.2f' % new_price) # 88.20
内部スコープで外部スコープの変数を変更する場合は、グローバルキーワードと非ローカルキーワードを使用する必要があります。
デモコードは次のとおりです。
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num) # 1
num = 123
print(num) # 123
fun1()
print(num) # 123
埋め込み関数とクロージャー:
デモコードは次のとおりです。
def outer():
print('outer函数在这被调用')
def inner():
print('inner函数在这被调用')
inner() # 该函数只能在outer函数内部被调用
outer()
# outer函数在这被调用
# inner函数在这被调用
#闭包是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。通过闭包可以访问外层非全局作用域的变量,这个作用域称为 闭包作用域。
def funX(x):
def funY(y):
return x * y
return funY
i = funX(8)
print(type(i)) # <class 'function'>
print(i(5)) # 40
#如果要修改闭包作用域中的变量则需要 nonlocal 关键字
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
# 100
# 100
再帰関数:
デモコードは次のとおりです。
#n! = 1 x 2 x 3 x ... x n
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
#斐波那契数列 f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1
def recur_fibo(n):
if n <= 1:
return n
return recur_fibo(n - 1) + recur_fibo(n - 2)
lst = list()
for k in range(11):
lst.append(recur_fibo(k))
print(lst)
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
二、ラムダ式
1.匿名関数の定義
Pythonには2つのタイプの関数があります。
- 最初のカテゴリ:defキーワードで定義された通常の関数
- 2番目のカテゴリ:ラムダキーワードで定義された匿名関数
Pythonは、defキーワードの代わりにlambdaキーワードを使用して匿名関数を作成します。関数名はなく、文法構造は次のとおりです。
lambda argument_list: expression
- ラムダ-匿名関数を定義するためのキーワード。
- 引数リスト-関数パラメーター。位置パラメーター、デフォルトパラメーター、キーワードパラメーター、および通常の関数と同じタイプのパラメーターにすることができます。
- :-コロン、関数パラメーターと式の間にコロンを追加します。
- 式-式だけで、関数パラメータを入力し、いくつかの値を出力します。
注意:
- ラムダはそれを返す必要がないため、式にはreturnステートメントがなく、式自体の結果が戻り値になります。
- 匿名関数には独自の名前名があり、パラメーターリストの外部またはグローバル名前名内のパラメーターにアクセスすることはできません。
デモコードは次のとおりです。
def sqr(x):
return x ** 2
print(sqr)
# <function sqr at 0x000000BABD3A4400>
y = [sqr(x) for x in range(10)]
print(y)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20)) # 30
func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5)) # 15
2.匿名機能の適用
機能プログラミングとは、すべてのコードが不変であり、純粋な関数で構成されていることを意味します。ここでの純粋な関数とは、関数が互いに独立していて、互いに影響を与えないことを意味します。同じ入力に対して、副作用のない同じ出力が常に存在します。
- 機能しないプログラミング:
デモコードは次のとおりです。
def f(x):
for i in range(0, len(x)):
x[i] += 10
return x
x = [1, 2, 3]
f(x)
print(x)
# [11, 12, 13]
- 機能プログラミング:
デモコードは次のとおりです。
def f(x):
y = []
for item in x:
y.append(item + 10)
return y
x = [1, 2, 3]
f(x)
print(x)
# [11, 12, 13]
匿名関数は、機能プログラミングの高次関数でよく使用されます。主に2つの形式があります。
- パラメータは関数(フィルタ、マップ)です
- 戻り値は関数(クロージャ)です
フィルタおよびマップ機能の適用:
- filter(function、iterable)シーケンスをフィルタリングし、条件を満たさない要素を除外して、イテレーターオブジェクトを返します。リストに変換する場合は、list()を使用して変換できます。
- map(function、* iterables)は、提供された関数に従って指定されたシーケンスをマップします
デモコードは次のとおりです。
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist)) # [1, 3, 5, 7, 9]
m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print(list(m1))
# [1, 4, 9, 16, 25]