Python研究ノート(4)-関数の理解

1.関数を定義します

関数名には小文字を使用することをお勧めします。PEP8を参照してください。

コード:

def greet():  #定义函数,注意冒号
    """显示简单的问候语"""   #文档字符串的注释
    print("Hello.")

greet()  
a = greet  #可以给定义的函数指定别名(函数名其实也是对象的引用)
greet()    #调用定义的函数
a()

結果:

Hello.
Hello.

2.パラメータを渡す

関数を定義するときに、同時に渡す必要のあるパラメーターを定義できます

コード:

def user_info(name, age):  #定义函数的时候设定需要的参数
    print("名字是:" + name + " 年龄是:" + str(age))  #age是int型,需要转化成字符串

user_info('葫芦娃', 1)  #调用函数时传递参数过去,参数顺序必须相同
# user_info(name='葫芦娃', age=1)  或者用这种直接赋值的方式,这样顺序可以不固定

結果:

名字是:葫芦娃 年龄是:1

関数を定義するときに、パラメーターのデフォルト値を指定できます。つまり、呼び出し時にパラメーターが渡されない場合、デフォルト値が渡されないパラメーター値として使用されます。

ps:デフォルトのパラメータは不変のオブジェクトを使用する必要があります

コード:

def user_info(name, age=1):  #age有默认值
    print("名字是:" + name + " 年龄是:" + str(age))

user_info('葫芦大娃') #没有传入第二个参数
user_info('葫芦二娃')
user_info('蛇精', 100) #有传入参数,则按照传入的参数值执行逻辑

結果:

名字是:葫芦大娃 年龄是:1
名字是:葫芦二娃 年龄是:1
名字是:蛇精 年龄是:100

(注:デフォルト値で関数を定義する場合、上記の年齢など、デフォルト値でパラメーターを後ろに配置する必要があります)

ヒント:デフォルトのパラメーターは、リストや辞書などの可変オブジェクトではなく、不変オブジェクトを指している必要があります

コード:

def test(mylist=['s', 's']):
    mylist.append('over')
    return mylist


print (test())  # 第一次调用时候,默认值列表已经创建,变量mylist指向该列表
print (test())  # 第二次调用时,因为列表是可变的,没有产生新对象,所以会在原来列表上继续操作


def grow(name, age=18):
    age = age + 1  # 函数里的+1运算产生了新的对象并由age指向,此时新的age以不是开始时的默认变量age
    # now = age + 1 可换个名字,下面输出语句也要换,就是好理解而已
    print ('name=' + name + '\nage=' + str(age) + '\n')


grow('ZhangSan')  # 第一次调用时,age变量指向的整数是18,是不可变的
grow('ZhangSan')  # 第二次调用时,因为整数是不可变的,所以age变量仍旧是指向整数18(函数里的+1运算产生了新的对象)


#age1和age2不是同一个
age1 = 18   #age1指向整数18
age2 = age1 #age2也指向整数18
age2 = age2 + 1 #因为整数是不可变的,所以age2+1操作后创建了新的对象,age2指向该对象
print (age1 is age2) # 所以age1和age2不同

#list1和list2是同一个
list1 = ['a', 'b']
list2 = list1
list2.append('c') #因为列表是可变的,所以list2.append操作后仍旧是该对象,list2仍旧指向它
print (list1 is list2) # 所以list1和list2相同

結果:

['s', 's', 'over']
['s', 's', 'over', 'over']
name=ZhangSan
age=19

name=ZhangSan
age=19

False
True

3.戻り値

この関数を使用returnして、リスト、辞書、文字列など、関数によって処理された一部のデータを返すことができます

def get_info(first_name, last_name):
    info= first_name + last_name
    return info #此处将处理后的字符串返回

print(get_info('葫芦', '娃'))

結果:

葫芦娃

戻り値は、で,区切って複数にすることができますたとえば、タプルとして返します

コード:

def myadd(x):
    return x, x + 1


a = myadd(1)
print (a)
#a[0] = 20  #此句会报错,因为多个返回值是以元组的方式返回,不可更改
one, two = a #多个变量可同时接收同一个元组,按位置赋值,两边的个数多或少都会报错
print (one)

結果:

(1, 2)
1

リターンリストはリターンディクショナリと同等であり、関数本体のロジックを置き換えるだけです。

4.任意の数の実際のパラメーターを渡します

関数を定義するときに、受け入れる必要のある実際のパラメーター(同じタイプのパラメーター)の数がわかりません。*パラメーター名を追加して、複数のパラメーターが受け入れられることを示すことができます(つまり、リストを渡すには、tuple→_→

コード:

def cook_food(count, *toppings):  # *toppings表示python创建了一个空元组,并将接收到的值加入到元组中
    """描述要制作的材料"""
    print(str(count) + "份")
    print(toppings)


cook_food(1, '葱', '姜', '蒜')  # 先传固定的实参,再传不固定的参数
cook_food(10, '肉')
mylist = ['葱', '蒜', '鱼', '鸡']
cook_food(1, mylist)  # 此句输出的是一个元组,但只有一个元素列表
cook_food(1, *mylist) # 此句是将参数mylist的所有元素,作为参数依次传递到函数里,输出的元组有四个元素

結果:

1份
('葱', '姜', '蒜')
10份
('肉',)
1份
(['葱', '蒜', '鱼', '鸡'],)
1份
('葱', '蒜', '鱼', '鸡')

5.任意の数のキーワード引数を渡します

**パラメータ名を追加するには、(複数のキーワード引数を渡すことができ、である辞書を渡すと、何の制限→_→はありません

コード:

def build_info(first, last, **user_info):  # **user_info表示,创建一个空字典,并将接收到的键-值对加入到字典中
    """创建一个字典,包含用户的所有信息"""
    info = {}
    info['first_name'] = first  # 添加字段
    info['last_name'] = last
    for key, value in user_info.items():
        info[key] = value
    return info  # 返回字典

#可以封装成字典传入,但是必须加**,例如**dict,不可只传入字典
info = build_info('葫芦', '娃', ability='力气大', 排行=1)
print(info)

結果:

{'ability': '力气大', '排行': 1, 'first_name': '葫芦', 'last_name': '娃'}

6、名前付きキーワードパラメータ

*パラメータセパレータとして使用される*、以下は渡すことができるキーワードパラメータです(辞書は渡されますが、制限があります→_→

コード:

def student(name, age, *, address, tel):  # 命名关键字可以有默认值
    print(name, age, address, tel)


student('Tom', 22, address='china', tel=110)  # 必须传入参数名address 和tel

結果:

Tom 22 china 110

名前付きキーワードパラメータはパラメータ名で渡す必要があり、位置パラメータの位置順序は固定する必要があり、名前付きキーワードパラメータの順序はありません。

関数定義のパラメーターに既に任意の数の実パラメーターがある場合(キーワード実パラメーター、つまり辞書にすることはできないことに注意してください)、以下の名前付きキーワードパラメーターを*分離する必要がなくなりました例えば:

コード:

def student(name, age, *otherinfo, address, tel):
    print(name, age, otherinfo, address, tel)


student('Tom', 22, 'nv', 180, address='china', tel=110)

結果:

Tom 22 ('nv', 180) china 110

7、再帰機能

ほとんどのように、独自の関数を呼び出します

例:タワーオブハノイは再帰的に実装されます

def move(n, a, b, c):
    if n == 1:
        print('move', a, '-->', c)
        return
    move(n-1, a, c, b)  # A上的n-1个盘子通过C移动到B
    print('move', a, '-->', c)  # A上最底的盘子移动到C
    move(n-1, b, a, c)  # B上的n-1个盘子通过A移动到C

move(4, 'A', 'B', 'C')

結果:

move A --> C
move A --> B
move C --> B
move A --> C
move B --> A
move B --> C
move A --> C

8.関数をモジュールに保存します

この関数の機能は、ロジックコードブロックをメイン関数から分離することです。この関数は、他のファイルに書き込んでから、importステートメントを使用して使用するファイルに注ぐことができます

1.モジュール全体をインポートします(ステートメントを使用import xxx

最初に.pyファイルを作成します

コード:  greet.py

def greet_message():  #定义函数,注意冒号
    """显示简单的问候语"""   #文档字符串的注释
    print("Hello.")

greet.py別のディレクトリを作成している.pyファイル

コード:  say.py

コード:

import greet  # import语句,整个导入之前写的函数模块
# import greet as gt  # 导入的时候可以用as,指定别名

greet.greet_message() # 使用moudle_name.function_name()的方式调用函数
# gt.greet_message()  # 通过指定的别名,调用函数,指定别名后原模块名就不可用了

2.特定の関数をインポートします(ステートメントを使用from xxx import xxx

コードは上記と同じですが、import greetステートメントを次のように置き換えfrom greet import greet_message ます。呼び出すときは、関数名を直接呼び出すだけです。たとえばgreet_message()asエイリアスを使用して関数を割り当てることもできます。

おすすめ

転載: blog.csdn.net/weixin_38452841/article/details/108367889