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
エイリアスを使用して関数を割り当てることもできます。