当前位置 : 主页 > 编程语言 > python >

python_函数(参数定义/(单/双星号*/**操作符解包实参:Unpacking Argument Lists)(double/函

来源:互联网 收集:自由互联 发布时间:2022-06-14
文章目录 ​​references​​ ​​变参函数特点一览​​ ​​trial code​​ ​​获取实形参/参名(尝试)​​ ​​结果​​ references 截取自python tutorial: ​​4.7. 定义函数​​ ​​4.8. 函数


文章目录

  • ​​references​​
  • ​​变参函数特点一览​​
  • ​​trial code​​
  • ​​获取实形参/参名(尝试)​​
  • ​​结果​​

references

截取自python tutorial:

  • ​​4.7. 定义函数​​
  • ​​4.8. 函数定义详解​​
  • ​​4.8.1. 默认值参数​​
  • ​​4.8.2. 关键字参数​​
  • ​​4.8.3. 特殊参数​​
  • ​​4.8.3.1. 位置或关键字参数​​
  • ​​4.8.3.2. 仅位置参数​​
  • ​​4.8.3.3. 仅限关键字参数​​
  • ​​4.8.3.4. 函数示例​​
  • ​​4.8.3.5. 小结​​
  • ​​4.8.4. 任意实参列表​​
  • ​​4.8.5. 解包实参列表​​
  • ​​4.8.6. Lambda 表达式​​
  • ​​4.8.7. 文档字符串​​
  • ​​4.8.8. 函数注解​​

变参函数特点一览

trial code

# %%
# 不定位置参数
def positional_args(*x):
if len(x) == 0:
print('None')
else:
print(x)


# test
positional_args(1) # (1,)
positional_args(1, 2, 3) # (1, 2, 3)
positional_args() # None
positional_args('t', 1, 'hello') # ('t', 1, 'hello')
# 不定位置参数不接受关键字参数实参
# positional_args(x=1)#TypeError: positional_args() got an unexpected keyword argument 'x'

# %%

# 不定关键字参数


def variables_keys(**x):
if len(x) == 0:
print('None')
else:
print(x)


# test
variables_keys()
variables_keys(x=1, y=2, z='c')
variables_keys(x=1, y=2)
# 不定关键字参数容器不接受位置参数实参
# fd(1, 2)#Expected 0 positional arguments

# %%
# 关键字参数可以使用位置参数的方式来传实参

print("# 关键字参数可以使用位置参数的方式来传实参")
def test_default(x="default value"):
print(x)


test_default() # 6(default value)
test_default("overwrite by positional parameter") # 7(overwrite)
test_default(x="overwrite by keyword parameter")

# 位置参数可以通过使用关键字参数的形式传递实参
print("# 位置参数可以通过使用关键字参数的形式传递实参 ")
def positional_by_key(x):
print(x)

positional_by_key(x="by keyword parameter")
# %%
# 位置参数,默认参数(关键字参数),不定位置参数,不定关键字参数


def test(x, y=1,
*a, # 保存位置参数序列的元组(经常以*args)
**b): # 保存关键字参数的字典
print(x, y, a, b)


test(1) # 1 1 () {}
test(1, 2) # 1 2 () {}
test(1, 2, 3, 4) # 1 2 (3, 4) {}
test(x=1, y=2) # 1 2 () {}
# 没有合适关键字形参,关键字实参将被传入到关键字参数容器(字典中)保存(即使关键字实参和不定形参容器名称(元组/字典)重名)
test(1, a=2) # 1 1 () {'a': 2}
test(1, 2, 3, a=4) # 1 2 (3,) {'a': 4}
test(1, 2, 3, c=4) # 1 2 (3,) {'c': 4}
# got multiple values for argument 'y'
# test(1, 2, 3, y=4)

获取实形参/参名(尝试)

import inspect

#from cxxulib.printer import print1
# 逐行打印函数
def print1(iterable,is_dict=0):
cnt=0
if(is_dict):
iterable=iterable.items()
# for item in iterable.items():
# print(item)
# for key,value in iterable.items():
# print(key,value)
for item in iterable:
cnt+=1
# @itemtype={type(item)}
print(f"@cnt={cnt};@item={item}")

v1 = 123
v2 = "aa"
argv1 = 'value1'
argv2 = 'value2'
# get parameter names
#通过inspect.signature()方法来获取形参
def foo(a, b, c):
sig = inspect.signature(foo)
# print(a, b, c)
print("@sig:",sig)
return sig


foo(argv1, argv2, argv2)

# local()方法来获取
def func(a, b):
keys = locals().keys()
print(keys)
parameters=[key for key in keys]
print("@parameters:",parameters)
return parameters


func(v1, v2)
# print(func(v1, v2))
# 通过func.__code__属性获取
# print(func.__code__.co_varnames)
# print(func.__code__.co_)

#获取传入的实参(不可靠的方法)
# 在函数外部获取变量信息
loc = locals()


# def locals() -> dict[str, Any]
# Return a dictionary containing the current scope's local variables.
# NOTE: Whether or not updates to this dictionary will affect name lookups in the local scope and vice-versa is implementation dependent and not covered by any backwards compatibility guarantees.

def get_argvs(value1, value2):
# print(loc)
# print1(locals(),is_dict=1)
# print(type(loc))
# print1(loc,is_dict=1)
# print(loc.keys())
# print(loc.get("loc"))
# print(type(loc.get("loc"))
# print1(loc.get("loc"), is_dict=1)
# print(loc["bbb"])
# vars=loc.pop("loc")
# del loc["loc"]
# print(loc)
# print1(vars,is_dict=1)
# print("@type:",type(loc))
argvs = []
# values = inspect.signature(get_argvs)
values = [value1, value2]
for key in loc:
if loc[key] in values:
argvs.append(key)
print("argvName:", key, ":", loc[key])
print("done!")
return argvs


print(get_argvs(argv1, argv2))

结果

@sig: (a, b, c)
dict_keys(['a', 'b'])
@parameters: ['a', 'b']
argvName: argv1 : value1
argvName: argv2 : value2
done!
['argv1', 'argv2']


上一篇:python_集合方法和集合中缀运算符
下一篇:没有了
网友评论