Pythonの基礎-08 関数の基礎

関数とは何ですか

  • 必要なときに呼び出せる、準備されたコードの束
  • コードの繰り返しによる欠点: 冗長性、保守性の低下
  • したがって、複数行のコードを 1 つの全体にまとめるには、次の関数を使用します。
  • Python では、キーワード def を使用して関数を宣言します
# def 函数名():
#   函数要执行的操作
  • 関数を定義しても、自動的には実行されません
  • 関数名(パラメータ)を使用して呼び出す必要があります
  • 関数名も識別子です
  • 数字、文字、アンダースコアで構成され、数字で始めることはできず、大文字と小文字が厳密に区別されます。キーワードは使用できません
  • 命名規則に従い、アンダースコアを使用して接続します。名前が示すように、関数によって実行されるロジックは関数の名前と一致していることが望ましいです。

関数パラメータ

  • 関数が宣言されるとき、括弧内のパラメータは仮パラメータ、または略して仮パラメータと呼ばれます。
  • 仮パラメータの値は不定であり、プレースホルダとしてのみ使用されます。
  • 関数を呼び出すときに、仮パラメータを渡すことができます
  • 関数の呼び出し時に渡されるパラメータは、操作に含まれる実際のデータであり、これを実パラメータと呼びます。
  • 関数を呼び出すと、実パラメータと仮パラメータが 1 対 1 に対応して渡されます。
  • 変数名を指定して、実パラメータを仮パラメータに渡すこともできます。

関数の戻り値

  • 戻り値は関数の実行結果ですが、すべての関数が戻り値を持つ必要があるわけではありません
def add(a,b):
    c = a+b  # 变量C在外部是不可见的,只能在函数内部使用
    return c  # return 表示一个函数的执行结果

result = add(1,2)
print(result ** 4)
  • 関数が値を返さない場合、None を返します。

関数のドキュメント

  • 関数本体で 3 つの引用符のペアを使用して、関数の説明を示します。
def add(a,b):
    """
    a: 第一个参数
    b: 第二个参数
    该函数返回两个数字相加的结果
    """
    return a+b
  • 関数を作成するときは、仮パラメータの後に int を追加して、渡す実際のパラメータの型を指定します。
def add(a:int,b:str):  # 希望a的类型是int,b的类型是str
    pass

関数呼び出し関数

  • 関数 2 では関数 1 を直接呼び出すことができます。関数 2 を呼び出すと、関数 2 のコード内の関数 1 の位置に従って関数 1 が呼び出されます。デモンストレーションは次のとおりです。
def function_1():
    print('函数1开始了')
    print('函数1结束了')

def function_2():
    print('函数2开始了')
    print('开始调用函数1')
    function_1()
    print('函数1调用结束')
    print('函数2结束了')

function_2()

# 函数2开始了
# 开始调用函数1
# 函数1开始了
# 函数1结束了
# 函数1调用结束
# 函数2结束了

# 求m阶乘的和
def fac(n):
    x = 1
    for i in range(1,n+1):
        x *= i
    return x

def sum(m):
    x = 0
    for i in range(1,m+1):
        x += fac(i)
    
    return x

print(sum(5))

グローバル変数とローカル変数

  • Python は関数を使用してスコープを分離できます
  • 関数の外部で定義された変数はグローバル変数であり、py ファイル全体からアクセスできます。
  • 関数内で定義された変数はローカル変数です。ローカル関数であり、関数内でのみ使用できます。
  • 組み込み関数 globals() locals() は、関数内のグローバル変数とローカル変数を出力できます。
a = 100  # a是全局变量
word = 'hello'

def test():
    b = 80  # b是局部变量
    a = 10  
    print(a)
    # 如果在函数内部声明了一个与外部全局变量相同名称的变量,会新建一个函数内部的局部变量
    # 而不是修改外部的全局变量
    # 如果需要修改全局变量,可以使用global关键字
    global word
    word = 'thank'
    print(word)
    print('locals = {},globals = {}'.format(locals(),globals()))  # ocals = {'b': 80, 'a': 10},globals = {'__name__': '__main_........ 全局变量非常多

test()  # 10
print(a)  # 100

print(word)  # thank

関数の複数の戻り値

  • return は関数の終了を示します
  • 通常の状況では、関数は最大でも 1 つの return ステートメントのみを実行します。
  • 特殊な場合 (finally ステートメント)、next 関数は複数の return ステートメントを実行することがあります。
def test(a,b):
    x = a // b
    y = a % b

    # return x 
    # return y
    # 以上代码只会执行一个return

    # return {'x':x,'y':y}  # 以字典的形式返回
    # return [x,y]  # 以列表的形式返回
    # return (x,y)  # 以元组的方式返回
    return x,y  # 返回的本质实际上就是返回一个元组

print(test(12,5))  # (2, 2)

デフォルトパラメータの使用

  • 一部の関数のパラメータは、パラメータを渡す場合は渡されたパラメータを使用し、パラメータを渡さない場合はデフォルト値を使用します。
# print函数中,end就是一个缺省参数
print('hello',end = '')
print('你好')
# hello你好
  • 仮パラメータのデフォルト値の設定方法:関数を定義する際、デフォルト値が必要な仮パラメータに直接値を与えます。
  • パラメータが渡されない場合はデフォルト値が使用され、パラメータが渡された場合は次のように渡されたパラメータが使用されます。
def say_hello(name,age,city='hangzhou'):
    print('大家好,我叫{},我今年{}岁了,我来自{}'.format(name,age,city))

say_hello('lzh',18)  # 大家好,我叫lzh,我今年18岁了,我来自hangzhou
  • 単一のパラメータを直接渡すことも、変数割り当ての形式で渡すこともできます。
  • 位置パラメータとキーワード パラメータがある場合は、キーワード パラメータを位置パラメータの後に配置する必要があります。
def say_hello(name,age,city='hangzhou'):
    print('大家好,我叫{},我今年{}岁了,我来自{}'.format(name,age,city))

say_hello(name ='lzh',city ='sichuan',age =18)  # 大家好,我叫lzh,我今年18岁了,我来自sichuan

可変パラメータの使用

  • *args を使用して可変の位置パラメータを表します --> タプルの形式で保存します
  • **kwargs を使用して可変キーワード パラメータを表す --> 辞書形式で保存
def add (a,b,*args):  # args 表示可变参数,必须有两个参数
    pass
add(1,4,65,7,8,43)  # 多出来的可变参数会以元组的形式保存到args中

def add(*args):  # 仅有可变参数
    pass

def add(a,b,*args,mul=2):  # 如果有关键字参数,需要放在可变参数之后
    pass

def add(a,b,*args,mul=2,**kwargs):  # 可以用 ** kwargs 来接受多余的关键字阐述
    pass

機能上の注意点

  • 関数の 3 つの要素
    • 関数名
    • パラメータ
    • 戻り値
  • 一部のプログラミング言語では関数の重複が許可されていますが、Python では関数の重複は許可されていません。
  • 関数の名前が同じ場合、後の関数が前の関数を上書きします。
  • Python では関数名も変数名として理解できます
  • したがって、関数を定義するときは、組み込み関数と同じ名前を付けないでください。

関数の再帰

  • 簡単に言えば、再帰とは、関数自体がそれ自体を呼び出すことを意味します。
  • 再帰で最も重要なことは、出口 (停止条件) を見つけることです。
# 使用函数递归求1-n的和
x = 0
def get_sum(n):
    global x
    x += n
    n -= 1
    if n >= 1:
        get_sum(n)
    return x

print(get_sum(100)) # 5050

# 递归方法2
def get_sum2(n):
    if n == 0:
        return n
    return n + get_sum2(n-1)

print(get_sum2(100))  # 5050

# 使用函数递归求n!
def get_num(n):
    if n == 0:
        return 1 
    return  n * get_num(n-1)

print(get_num(0))  # 1

# 斐波那契数列的第N个数字
def get_fi(n):
    if n == 2 or n == 1:
        return 1
    return get_fi(n-2) + get_fi(n-1)

print(get_fi(8))  # 21

無名関数

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

x = add(1,2)  # 函数名(实参)作用是调用函数,获取到行数的执行结果并赋值给变量 x

fn = add  # 相当于给函数add起了一个别名叫fn

  • キーワード lambda を使用して関数を定義できます
  • 匿名関数。単純な関数を表現するために使用されます。
  • 無名関数を呼び出す方法:
    • 1 つ目: 彼の名前を定義します (このように使用されることはほとんどありません)
    • 2 番目: この関数をパラメータとして別の関数に渡して使用します。
lambda a,b: a+b  
fn2 = lambda a,b: a+b  # 第一种调用方法

def calc(a,b,fn):
    c= fn(a,b)
    return c

x3 = calc(1,3,lambda x,y: x+y)  # 第二种调用方法:借用回调函数
print(x3)

ソートメソッドの使用

  • 組み込み関数と組み込みクラスの部分的なリスト (組み込み関数の使用)
# 列表的 sort 内置方法会直接对列表进行排序
# sorted 内置函数,不会改变原有的数据,而是生成一个新的结果
students = [
    {
    
    'name':'zhoujielun','age':18,'sorce':97,'height':180},
    {
    
    'name':'linjunjie','age':22,'sorce':65,'height':177},
    {
    
    'name':'caiyilin','age':20,'sorce':88,'height':185}
]

# 字典和字典之间不能使用比较运算
# students.sort()  # '<' not supported between instances of 'dict' and 'dict'

# 需要传递一个 key 参数,指定比较的规则
# key 的参数类型是一个函数
# def foo(ele):
#     return ele['age']  # 在foo方法中,指定按照年龄进行排序

# students.sort(key=foo)  
# 在sort方法中,会调用key中给定的函数,并且传入参数,参数是列表中的元素
# [{'name': 'zhoujielun', 'age': 18, 'sorce': 97, 'height': 180},
#  {'name': 'caiyilin', 'age': 20, 'sorce': 88, 'height': 185}, 
# {'name': 'linjunjie', 'age': 22, 'sorce': 65, 'height': 177}]

# 简化sort函数
students.sort(key= lambda ele:ele['height'])
# [{'name': 'linjunjie', 'age': 22, 'sorce': 65, 'height': 177}, 
# {'name': 'zhoujielun', 'age': 18, 'sorce': 97, 'height': 180}, 
# {'name': 'caiyilin', 'age': 20, 'sorce': 88, 'height': 185}]

print(students)

フィルター・マップ・リデュース組み込みクラスの使用

  • filter は反復可能なオブジェクトをフィルタリングし、フィルター オブジェクトを取得できます。
  • Python2では組み込み関数ですが、Python3では組み込みクラスに変更されます。
# fliter 可以给定两个参数
# 第一个参数是一个函数
# 第二个参数是可迭代对象
# filter返回的结果是一个fiilter类型的对象
# filter对象本身也是一个可迭代的对象

x = filter(lambda a: a%2 == 0,range(1,10))
print(x)  # <filter object at 0x0000024ED08E9FA0>
print(list(x))  # [2, 4, 6, 8]
for i in x:
    print(i,end='')  # 2468

# map 内置方法,将可迭代对象中所有的元素按照map指定的方法处理
# 返回一个map类型的可迭代对象
ages = [10,11,25,16,8,14,46,547]

m = map(lambda a: a+2,ages)
for x in m:
    print(x,end=' ')  # 12 13 27 18 10 16 48 549

# reduce 以前是一个内置函数,现在在functools模块中
# 内置函数和内置类都在 builtin.py 文件中定义
from functools import reduce
def foo(x,y):
    return x + y 

scores = [100,154,1564,4684]

print(reduce(foo,scores))  # 6502

# 使用内置方法,求students中所有的age相加
from functools import reduce

students = [
    {
    
    'name':'zhoujielun','age':18,'sorce':97,'height':180},
    {
    
    'name':'linjunjie','age':22,'sorce':65,'height':177},
    {
    
    'name':'caiyilin','age':20,'sorce':88,'height':185}
]

# 使用map函数先处理获取age,再使用reduce进行相加
print(reduce(lambda x1,x2:x1+x2,map(lambda a: a['age'],students)))  # 60

# 或者直接给定reduce的初始值为0,那么第一轮运算时,给的第一个x的值就是0
print(reduce(lambda x1,x2:x1+x2['age'],students,0))  # 60

おすすめ

転載: blog.csdn.net/Lz__Heng/article/details/130192223