Python 语言及其应用 Chapter_4_Note_2 函数_参数_

本文深入讲解Python函数中不同类型的参数,包括位置参数、关键字参数、命名关键字参数等,并通过实例展示了如何使用*args和**kwargs收集不定数量的参数。

先前的联系中,函数的参数,尤其是带星号的参数,没怎么复习,这里再复习下

当参数被用在函数内部时, 星号将一组可变数量的位置参数集合成参数值的元组。在下面
的例子中args 是传入到函数print_args() 的参数值的元组

>>> def print_args(*args):
... print('Positional argument tuple:', args)
...
无参数调用函数,则什么也不会返回:
>>> print_args()
Positional argument tuple: ()
给函数传入的所有参数都会以元组的形式返回输出
>>> print_args(3, 2, 1, 'wait!', 'uh...')
Positional argument tuple: (3, 2, 1, 'wait!', 'uh...')
这样的技巧对于编写像print() 一样接受可变数量的参数的函数是非常有用的。如果你的
函数同时有限定的位置参数,那么*args 会收集剩下的参数:
>>> def print_more(required1, required2, *args):
... print('Need this one:', required1)
... print('Need this one too:', required2)
... print('All the rest:', args)
...
>>> print_more('cap', 'gloves', 'scarf', 'monocle', 'mustache wax')
Need this one: cap
Need this one too: gloves
All the rest: ('scarf', 'monocle', 'mustache wax')
当使用* 时不需要调用元组参数args,不过这也是Python 的一个常见做法。



使用**收集关键字参数
使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字

典的值。下面的例子定义了函数print_kwargs(),然后打印输出它的关键字参数:
>>> def print_kwargs(**kwargs):
... print('Keyword arguments:', kwargs)
...
现在,使用一些关键字参数调用函数:
>>> print_kwargs(wine='merlot', entree='mutton', dessert='macaroon')
Keyword arguments: {'dessert': 'macaroon', 'wine': 'merlot', 'entree': 'mutton'}
在函数内部,kwargs 是一个字典。
如果你把带有*args 和**kwargs 的位置参数混合起来,它们会按照顺序解析。和args 一
样,调用时不需要参数kwargs,这也是常见用法。



随后一个重要概念,这本书里没讲,就是还有一个叫做 命名关键字

就是要限制你输入的关键字名字,怎么用呢?


def person(name, age, *, city, job):
    print(name, age, city, job)

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数

调用方式如下:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)

由于命名关键字参数city具有默认值,调用时,可不传入city参数:

>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:

def person(name, age, city, job):
    # 缺少 *,city和job被视为位置参数
    pass


下面看一下自己对以上做的测试,还有就是关于命名关键字参数,如果在调用函数时,没有给予分隔符*后面对应的名字,那么就会报错。













def on_tree_item_clicked(self, item, column): level = 0 parent = item.parent() while parent: level += 1 parent = parent.parent() try: with POOL_E.connection() as conn: with conn.cursor() as cursor: params = [] if level == 0: return elif level == 1: book_name = item.parent().text(0) chapter_name = item.text(0) query = """ SELECT 章节内容, 笔记, 书名, 章节 FROM 普通古籍 WHERE 书名 = %s AND 章节 = %s AND (标题 IS NULL OR 标题 = '') """ params = (book_name, chapter_name) self.current_record_type = 'chapter' elif level == 2: chapter_item = item.parent() book_name = chapter_item.parent().text(0) chapter_name = chapter_item.text(0) title_name = item.text(0) query = """ SELECT 标题内容, 笔记, 书名, 章节 FROM 普通古籍 WHERE 书名 = %s AND 章节 = %s AND 标题 = %s """ params = (book_name, chapter_name, title_name) self.current_record_type = 'title' else: return cursor.execute(query, params) result = cursor.fetchone() if result: content = result.get('标题内容') or result.get('章节内容') note = result.get('笔记') self.original_html_content = content self.original_html_note = note self.note_book_name = result.get('书名') self.note_chapter_name = result.get('章节') # 保存当前标题名(如果存在) if self.current_record_type == 'title': self.note_title_name = title_name else: self.note_title_name = None self.ui.textEdit_3.setHtml(content) self.ui.textEdit.setHtml(note) else: print("[调试] 未找到对应内容") except Exception as e: import traceback traceback.print_exc() 再运行check_and_create_folder肯定会先加载内容,把加载内容时提取的书名给check_and_create_folder用于动态生成路径
最新发布
09-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值