加油,今天的任务是学习面向对象编程,设计一个简单的宠物管理系统(宠物类、猫 / 狗子类),先做5道题目开启学习状态吧!

1 setdefault()

在 Python 中,setdefault() 是字典(dict)对象的一个内置方法,用于安全地获取或设置字典中的键值对。

它的核心作用是:当字典中不存在指定的键时,自动为其设置默认值并返回;若键已存在,则直接返回现有值

基本语法

python

运行

dict.setdefault(key, default=None)
  • 参数
    • key:必需,要查找或设置的键。
    • default:可选,当键不存在时设置的默认值(默认为 None)。
  • 返回值:键对应的值(若键已存在)或新设置的默认值(若键不存在)。

核心逻辑

  1. 若键已存在:直接返回键对应的值,不修改字典。
  2. 若键不存在
    • 将键添加到字典中,值设为 default
    • 返回这个默认值。

典型应用场景

1. 统计元素频率(如你提供的代码)

python

运行

s = "abcasdacbdec"
d = {}
for char in s:d[char] = d.setdefault(char, 0) + 1
print(d)  # 输出:{'a': 2, 'b': 2, 'c': 3, 's': 1, 'd': 2, 'e': 1}

等价逻辑(不用 setdefault()):

python

运行

if char not in d:d[char] = 0  # 初始化
d[char] += 1     # 累加
2. 初始化嵌套字典

python

运行

data = {}
data.setdefault("users", {})["Alice"] = {"age": 30}
print(data)  # 输出:{'users': {'Alice': {'age': 30}}}

等价于:

python

运行

if "users" not in data:data["users"] = {}
data["users"]["Alice"] = {"age": 30}
3. 处理默认值的复杂场景

python

运行

# 统计每个字母开头的名字列表
names = ["Alice", "Bob", "Charlie", "Alex"]
groups = {}
for name in names:letter = name[0]groups.setdefault(letter, []).append(name)
print(groups)
# 输出:{'A': ['Alice', 'Alex'], 'B': ['Bob'], 'C': ['Charlie']}

与其他方法的对比

方法键存在时键不存在时是否修改字典
dict.setdefault(key, default)返回现有值设置默认值并返回
dict.get(key, default)返回现有值返回默认值(不修改字典)
key in dict + 手动赋值需要额外判断需手动初始化并赋值

注意事项

  1. 默认值的计算时机default 参数在键不存在时才会被计算。例如:

    python

    运行

    d = {}
    d.setdefault("key", [].append(1))  # 默认值为 None,因为 append() 返回 None
    
  2. 避免使用可变对象作为默认值

    python

    运行

    # 错误示范:所有键共享同一个列表
    d = {}
    d.setdefault("a", []).append(1)
    d.setdefault("b", []).append(2)
    print(d)  # 可能输出 {'a': [1, 2], 'b': [1, 2]}(取决于实现)
    

    正确做法:每次调用时创建新对象:

    python

    运行

    d.setdefault("a", list()).append(1)
    
  3. 性能考量setdefault() 比先判断 if key not in dict 再赋值略快,因为只需要查找一次键。

总结

setdefault() 的核心优势在于用一行代码替代三行代码(判断键是否存在 → 不存在则初始化 → 返回值),让代码更简洁。

但在需要频繁初始化默认值的场景中,使用 collections.defaultdict 可能更高效。

2 lambda函数

在 Python 中,lambda 函数是一种匿名函数(即没有显式定义函数名的函数),它允许你快速创建简单的、单行的函数。它的核心设计目的是为了满足临时、一次性使用的简单函数需求,让代码更简洁。

一、基本语法

python

运行

lambda 参数1, 参数2, ...: 表达式
  • 参数:可以有零个或多个,用逗号分隔。
  • 表达式:函数的返回值,只能包含一个表达式(不能包含语句,如 iffor 等)。

示例:定义一个加法函数:

python

运行

add = lambda x, y: x + y
print(add(3, 5))  # 输出:8

等价的普通函数

python

运行

def add(x, y):return x + y

二、核心特性

1. 匿名性

lambda 函数没有显式的函数名,通常赋值给变量或作为参数传递给其他函数。

python

运行

# 作为参数传递给 sorted()
names = ["Alice", "Bob", "Charlie"]
sorted_names = sorted(names, key=lambda name: len(name))
print(sorted_names)  # 输出:['Bob', 'Alice', 'Charlie']
2. 单一表达式

lambda 只能包含一个表达式,不能包含复杂的逻辑。例如,不能直接使用条件语句,但可以用三元表达式:

python

运行

# 返回绝对值
abs_value = lambda x: x if x >= 0 else -x
print(abs_value(-5))  # 输出:5
3. 即时执行

可以立即调用 lambda 函数:

python

运行

result = (lambda x: x * x)(3)
print(result)  # 输出:9

三、常见应用场景

1. 作为高阶函数的参数

在 sorted()map()filter()reduce() 等函数中作为排序规则或操作逻辑:

python

运行

# map():对列表每个元素平方
nums = [1, 2, 3]
squares = list(map(lambda x: x**2, nums))
print(squares)  # 输出:[1, 4, 9]# filter():筛选偶数
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)  # 输出:[2]
2. 回调函数

在 GUI 编程或异步编程中作为事件处理函数:

python

运行

# 示例(伪代码):按钮点击事件
button.on_click(lambda: print("Button clicked!"))
3. 闭包

捕获外部变量,创建闭包:

python

运行

def multiplier(n):return lambda x: x * ndouble = multiplier(2)
print(double(5))  # 输出:10

四、优缺点

优点
  • 简洁:减少代码行数,适合简单逻辑。
  • 可读性:在合适场景下(如排序规则),比普通函数更直观。
  • 临时使用:无需命名,避免污染命名空间。
缺点
  • 功能受限:只能包含单个表达式,复杂逻辑需改用普通函数。
  • 可读性下降:过度使用或嵌套 lambda 会导致代码晦涩难懂。
  • 调试困难:没有函数名,堆栈跟踪信息不直观。

五、与普通函数的对比

特性lambda 函数普通函数 (def)
定义语法单行表达式多行语句块
函数名匿名,需赋值给变量必须有函数名
返回值自动返回表达式结果必须显式使用 return 语句
逻辑复杂度只能包含简单表达式可以包含任意复杂逻辑
文档字符串不支持支持(使用 __doc__

六、注意事项

  1. 避免过度使用:如果 lambda 逻辑复杂,建议用普通函数提高可读性。
  2. 默认参数:支持默认参数,但需注意参数绑定问题:

    python

    运行

    # 错误示例:所有函数共享同一个 x 值
    funcs = [lambda x=x: x*2 for x in range(3)]
    print(funcs[0](10))  # 输出:20(正确)
    

  3. 性能:与普通函数无显著差异,但复杂逻辑用普通函数更高效。

总结

lambda 函数是 Python 中一种轻量级的函数定义方式,适合快速定义简单的、一次性使用的函数。它在高阶函数、回调逻辑等场景中特别有用,但需适度使用,避免牺牲代码可读性。对于复杂或复用性高的函数,仍建议使用普通函数。

个人理解:看起来就是懒得def一个函数了(^ ^)

你的观察很准确!lambda 的核心设计目的就是为了避免为简单功能专门定义一个完整的函数,让代码更简洁。它本质上是一种语法糖,用于快速创建一次性的、简短的函数,特别适合作为参数传递给其他函数的场景。

为什么需要 lambda

对比以下两种写法:

场景:对列表按元素长度排序

使用 def

python

运行

def get_length(s):return len(s)names = ["Alice", "Bob", "Charlie"]
sorted(names, key=get_length)  # 需要先定义函数,再传递

使用 lambda

python

运行

names = ["Alice", "Bob", "Charlie"]
sorted(names, key=lambda s: len(s))  # 直接内联定义,无需命名
优势:
  1. 减少命名污染:无需为临时函数创建名称(如 get_length)。
  2. 代码紧凑:函数定义与使用位置更接近,逻辑更连贯。
  3. 即时性:适合只需使用一次的简单逻辑,避免函数定义的 “仪式感”。

哪些场景最适合用 lambda

  1. 排序规则(如 sorted()list.sort() 的 key 参数)。
  2. 数据转换(如 map()filter() 的操作函数)。
  3. 回调函数(如 GUI 事件处理、异步编程)。
  4. 闭包(如创建轻量级工厂函数)。

与 def 的权衡

场景lambdadef
简单的单行逻辑✅ 完美选择❌ 过于繁琐
复杂逻辑(多语句、循环等)❌ 不支持✅ 必须使用
需要复用的函数❌ 难以复用✅ 定义一次,多处调用
需要文档字符串或类型注解❌ 不支持✅ 完整支持

一句话总结

lambda 就像是程序员的 “便利贴”—— 当你需要快速写一个临时的、简单的功能,又不想费心思命名和组织一个完整的函数时,它就是最佳选择。

但对于复杂或需要复用的逻辑,还是应该用 def 定义正式的函数。

3 zip函数

在 Python 里,zip() 是一个很实用的内置函数,它能够将多个可迭代对象(像列表、元组、字符串等)中对应的元素打包成一个个元组,最后返回由这些元组组成的迭代器。

这种功能在需要同时处理多个可迭代对象的元素时特别有用。下面为你详细介绍它的用法和特性:

基本语法

python

运行

zip(*iterables)

这里的 *iterables 表示接受任意数量的可迭代对象作为参数。

基础示例

python

运行

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]# 对两个列表进行打包
zipped = zip(names, ages)# 将迭代器转换为列表查看结果
print(list(zipped))  # 输出:[('Alice', 25), ('Bob', 30), ('Charlie', 35)]

处理多个可迭代对象

zip() 函数可以处理任意数量的可迭代对象。

python

运行

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
scores = [85, 90, 78]# 对三个列表进行打包
zipped = zip(names, ages, scores)print(list(zipped))  # 输出:[('Alice', 25, 85), ('Bob', 30, 90), ('Charlie', 35, 78)]

处理不同长度的可迭代对象

当可迭代对象的长度不一致时,zip() 会以最短的可迭代对象为标准进行截断。

python

运行

names = ['Alice', 'Bob', 'Charlie']  # 长度为3
ages = [25, 30]  # 长度为2zipped = zip(names, ages)print(list(zipped))  # 输出:[('Alice', 25), ('Bob', 30)],'Charlie'被忽略了

与循环结合使用

在循环中使用 zip() 可以同时遍历多个可迭代对象。

python

运行

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]for name, age in zip(names, ages):print(f"{name} is {age} years old.")# 输出:
# Alice is 25 years old.
# Bob is 30 years old.
# Charlie is 35 years old.

解压操作

借助 * 操作符和 zip() 可以实现解压。

python

运行

pairs = [('Alice', 25), ('Bob', 30), ('Charlie', 35)]names, ages = zip(*pairs)print(names)  # 输出:('Alice', 'Bob', 'Charlie')
print(ages)   # 输出:(25, 30, 35)

注意事项

  • 返回的是迭代器:在 Python 3 中,zip() 返回的是一个迭代器,这意味着它是惰性计算的,仅在需要时才生成值。如果需要多次使用结果或者将其转换为列表,就需要手动进行转换。
  • 截断行为:当可迭代对象长度不同时,zip() 会截断结果,只处理到最短的可迭代对象结束。要是你希望处理到最长的可迭代对象结束,可以使用 itertools.zip_longest() 函数。
  • 空可迭代对象:如果传入空的可迭代对象,zip() 会直接返回一个空迭代器。

zip() 函数是 Python 中进行并行迭代的重要工具,在数据处理、循环操作以及函数参数传递等场景中都经常会用到。

4 Python 的 dict(字典)

Python 的 dict(字典) 是一种非常重要且强大的数据结构,用于存储键值对(Key-Value Pairs)。它类似于现实中的字典,通过 “键”(key)可以快速找到对应的 “值”(value)。下面从基础到进阶详细介绍:

1. 基础概念

特点
  • 无序存储(Python 3.7+ 后保留插入顺序)。
  • 键必须唯一,且不可变(如字符串、数字、元组)。
  • 值可以是任意类型,如整数、列表、甚至其他字典。
创建字典

python

运行

# 方式 1:直接用花括号
empty_dict = {}
person = {'name': 'Alice', 'age': 25, 'city': 'New York'}# 方式 2:使用 dict() 构造函数
person = dict(name='Bob', age=30, city='London')  # 关键字参数# 方式 3:从键值对列表创建
pairs = [('name', 'Charlie'), ('age', 35)]
person = dict(pairs)  # {'name': 'Charlie', 'age': 35}# 方式 4:使用 dict.fromkeys()
keys = ['a', 'b', 'c']
default_value = 0
my_dict = dict.fromkeys(keys, default_value)  # {'a': 0, 'b': 0, 'c': 0}

2. 基本操作

访问值

python

运行

person = {'name': 'Alice', 'age': 25}print(person['name'])      # 输出:Alice(键存在)
# print(person['city'])    # 报错:KeyError(键不存在)print(person.get('city'))  # 输出:None(默认值)
print(person.get('city', 'N/A'))  # 输出:N/A(自定义默认值)
修改 / 添加键值对

python

运行

person = {'name': 'Alice', 'age': 25}person['age'] = 26         # 修改已有键的值
person['city'] = 'Paris'   # 添加新键值对print(person)  # 输出:{'name': 'Alice', 'age': 26, 'city': 'Paris'}
删除键值对

python

运行

person = {'name': 'Alice', 'age': 25, 'city': 'New York'}age = person.pop('age')    # 删除键 'age',返回其值 25
del person['city']         # 直接删除键 'city'print(person)  # 输出:{'name': 'Alice'}
判断键是否存在

python

运行

person = {'name': 'Alice', 'age': 25}print('name' in person)    # 输出:True
print('city' in person)    # 输出:False

3. 常用方法

获取所有键 / 值 / 键值对

python

运行

person = {'name': 'Alice', 'age': 25, 'city': 'New York'}print(person.keys())    # 输出:dict_keys(['name', 'age', 'city'])
print(person.values())  # 输出:dict_values(['Alice', 25, 'New York'])
print(person.items())   # 输出:dict_items([('name', 'Alice'), ('age', 25), ('city', 'New York')])# 遍历键值对
for key, value in person.items():print(f"{key}: {value}")
合并字典

python

运行

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}# 方式 1:update() 方法(修改原字典)
dict1.update(dict2)
print(dict1)  # 输出:{'a': 1, 'b': 3, 'c': 4}# 方式 2:使用 | 运算符(Python 3.9+)
merged = dict1 | dict2  # 创建新字典,不修改原字典
安全获取值:setdefault()

python

运行

person = {'name': 'Alice', 'age': 25}# 如果键不存在,设置默认值并返回
city = person.setdefault('city', 'New York')
print(city)  # 输出:New York
print(person)  # 输出:{'name': 'Alice', 'age': 25, 'city': 'New York'}# 如果键存在,不修改并返回已有值
age = person.setdefault('age', 30)
print(age)  # 输出:25(已有值)

4. 高级用法

字典推导式

python

运行

# 从列表创建字典
numbers = [1, 2, 3, 4]
squares = {num: num**2 for num in numbers}
print(squares)  # 输出:{1: 1, 2: 4, 3: 9, 4: 16}# 筛选元素
even_squares = {num: num**2 for num in numbers if num % 2 == 0}
print(even_squares)  # 输出:{2: 4, 4: 16}
嵌套字典

python

运行

students = {'Alice': {'age': 25, 'grades': [85, 90, 95]},'Bob': {'age': 24, 'grades': [75, 80, 85]}
}print(students['Alice']['grades'])  # 输出:[85, 90, 95]
有序字典(Python 3.7+ 默认有序)

python

运行

# Python 3.7+ 中,dict 会保留插入顺序
ordered_dict = {}
ordered_dict['a'] = 1
ordered_dict['b'] = 2
ordered_dict['c'] = 3print(ordered_dict)  # 输出:{'a': 1, 'b': 2, 'c': 3}

5. 性能特点

  • 查找速度极快:时间复杂度为 O (1),适合大数据量的快速查找。
  • 键必须可哈希:键需要是不可变类型(如字符串、数字、元组),因为字典使用哈希表实现。

6. 常见应用场景

统计词频

python

运行

words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
word_count = {}for word in words:word_count[word] = word_count.get(word, 0) + 1print(word_count)  # 输出:{'apple': 3, 'banana': 2, 'cherry': 1}
配置管理

python

运行

default_config = {'theme': 'light','font_size': 12,'show_ads': True
}user_config = {'font_size': 14,'show_ads': False
}# 合并配置
final_config = default_config.copy()
final_config.update(user_config)print(final_config)  # 输出:{'theme': 'light', 'font_size': 14, 'show_ads': False}

7. 与其他数据结构的对比

数据结构特点适用场景
dict键值对,无序,查找快快速查找、统计、配置管理
list有序,可重复,支持索引有序集合、需要顺序访问的场景
set无序,唯一,支持集合运算去重、成员检测、集合操作

总结

dict 是 Python 中最常用的数据结构之一,其核心优势是高效的键值对存储和快速查找。掌握 dict 的各种方法(如 get()setdefault()update())和高级用法(推导式、嵌套),能让你的代码更简洁、高效。

5  Python 的 zip()dict 和 Java 的 Map 放在一起对比

1. 核心概念对比

特性Python zip()Python dictJava Map
本质迭代器(生成元组)键值对集合(哈希表)键值对接口(如 HashMap
用途并行迭代多个序列,生成临时配对存储、查询和操作键值对存储、查询和操作键值对
键的唯一性不保证(可重复)键必须唯一(重复会覆盖)键必须唯一
示例语法zip(keys, values){'a': 1, 'b': 2}Map<String, Integer> map = new HashMap<>()

2. 三者关联与转换

从 zip() 到 dict

~~~~~~\(@_@)/~~~~~~

zip() 生成的元组可直接转为 dict

python

运行

keys = ['a', 'b', 'c']
values = [1, 2, 3]# 用 zip() 创建字典
my_dict = dict(zip(keys, values))
print(my_dict)  # 输出:{'a': 1, 'b': 2, 'c': 3}
Python dict 与 Java Map 的等价操作
操作Python dictJava Map
创建字典 / 映射person = {'name': 'Alice', 'age': 25}Map<String, Integer> map = new HashMap<>();
添加 / 修改键值对person['city'] = 'New York'map.put("city", "New York");
获取值name = person.get('name', 'Unknown')String name = map.getOrDefault("name", "Unknown");
删除键值对person.pop('age')map.remove("age");
判断键是否存在'name' in personmap.containsKey("name");
获取所有键person.keys()map.keySet();
获取所有值person.values()map.values();
获取键值对数量len(person)map.size();

3. 关键方法对比

zip() 的核心用法

python

运行

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]# 并行迭代
for name, age in zip(names, ages):print(f"{name} is {age} years old.")# 生成字典
person_dict = dict(zip(names, ages))
print(person_dict)  # 输出:{'Alice': 25, 'Bob': 30, 'Charlie': 35}
dict 的核心方法

python

运行

# 创建字典
person = {'name': 'Alice', 'age': 25}# get():安全获取值
print(person.get('name'))        # 输出:Alice
print(person.get('city', 'N/A')) # 输出:N/A(默认值)# setdefault():获取值或初始化
person.setdefault('city', 'New York')
print(person)  # 输出:{'name': 'Alice', 'age': 25, 'city': 'New York'}# update():批量更新
person.update({'age': 26, 'job': 'Engineer'})
print(person)  # 输出:{'name': 'Alice', 'age': 26, 'city': 'New York', 'job': 'Engineer'}
Java Map 的核心方法

java

import java.util.HashMap;
import java.util.Map;public class MapExample {public static void main(String[] args) {// 创建 MapMap<String, Integer> scores = new HashMap<>();// 添加键值对scores.put("Alice", 90);scores.put("Bob", 85);// get():获取值System.out.println(scores.get("Alice"));  // 输出:90// getOrDefault():安全获取值System.out.println(scores.getOrDefault("Charlie", 0));  // 输出:0// putIfAbsent():类似 setdefault()scores.putIfAbsent("Bob", 100);  // 不修改已存在的键scores.putIfAbsent("Charlie", 75);// putAll():类似 update()Map<String, Integer> newScores = Map.of("David", 88, "Eve", 92);scores.putAll(newScores);System.out.println(scores);  // 输出:{Alice=90, Bob=85, Charlie=75, David=88, Eve=92}}
}

4. 应用场景对比

场景Python 方案Java 方案
统计词频word_count = {}
for word in words:
word_count[word] = word_count.get(word, 0) + 1
Map<String, Integer> wordCount = new HashMap<>();
for (String word : words) {
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
并行迭代多个列表for name, age in zip(names, ages):
print(f"{name} is {age}")
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i) + " is " + ages.get(i));
}
配置合并default_config = {...}
user_config = {...}
final_config = default_config.copy()
final_config.update(user_config)
Map<String, Object> defaultConfig = ...
Map<String, Object> userConfig = ...
Map<String, Object> finalConfig = new HashMap<>(defaultConfig);
finalConfig.putAll(userConfig);

5. 总结

  • zip() 是 Python 的 “配对工具”,用于生成临时的元组序列,常作为构建 dict 的中间步骤。
  • dict 是 Python 的核心数据结构,相当于 Java 的 HashMap,提供高效的键值对存储。
  • Java Map 是接口,需通过 HashMap 等实现类使用,语法更繁琐但类型更严格。

一句话概括

  • Pythonzip() → 生成配对 → dict 存储
  • Java:直接用 Map 存储

6 python命令行参数的传递方式

在 Python 中,命令行参数的传递是脚本与外部环境交互的重要方式。以下是几种常见的参数传递方式及其使用场景:

1. 基础方式:sys.argv

原理:Python 的 sys 模块提供 argv 列表,包含命令行传递的所有参数。
特点:简单直接,适合小型脚本。

示例代码

python

运行

# myscript.py
from sys import argvprint("脚本名:", argv[0])  # 第一个元素是脚本本身
print("所有参数:", argv)   # 完整参数列表# 获取特定参数
if len(argv) > 2:print("第一个参数:", argv[1])print("第二个参数:", argv[2])
运行示例

bash

python myscript.py hello world
# 输出:
# 脚本名: myscript.py
# 所有参数: ['myscript.py', 'hello', 'world']
# 第一个参数: hello
# 第二个参数: world
注意事项
  • 索引从 0 开始argv[0] 是脚本名,argv[1] 是第一个参数。
  • 参数类型:所有参数都是字符串类型,需要手动转换(如 int(argv[1]))。
  • 边界检查:使用前需通过 len(argv) 检查参数数量,避免索引越界。

2. 标准库:argparse(推荐)

原理:提供更高级的参数解析功能,支持参数选项(如 -h--verbose)和自动生成帮助信息。
特点:功能强大,适合复杂命令行工具。

示例代码

python

运行

# mytool.py
import argparse# 创建解析器
parser = argparse.ArgumentParser(description='处理命令行参数')# 添加位置参数(必需参数)
parser.add_argument('input_file', help='输入文件路径')
parser.add_argument('output_file', help='输出文件路径')# 添加可选参数
parser.add_argument('-v', '--verbose', action='store_true', help='显示详细信息')
parser.add_argument('-n', '--number', type=int, default=10, help='处理数量')# 解析参数
args = parser.parse_args()# 使用参数
print(f"输入文件: {args.input_file}")
print(f"输出文件: {args.output_file}")
print(f"处理数量: {args.number}")
if args.verbose:print("正在进行详细处理...")
运行示例

bash

# 基本用法
python mytool.py input.txt output.txt# 使用可选参数
python mytool.py input.txt output.txt -v --number 20# 查看帮助信息
python mytool.py -h
核心功能
  • 位置参数:按顺序传递的必需参数(如 input_file)。
  • 可选参数:以 - 或 -- 开头的参数(如 -v--number)。
  • 参数类型:通过 type=int 指定参数类型。
  • 默认值:通过 default=10 设置默认值。
  • 帮助信息:自动生成 -h 帮助文档。

3. 第三方库:click

原理:基于装饰器的命令行接口库,提供更优雅的参数定义方式。
特点:代码简洁,支持子命令,适合构建复杂工具。

示例代码

python

运行

# mycli.py
import click@click.command()
@click.option('--count', default=1, help='重复次数')
@click.option('--name', prompt='你的名字', help='问候对象')
def hello(count, name):"""简单的问候工具"""for _ in range(count):click.echo(f"Hello, {name}!")if __name__ == '__main__':hello()
运行示例

bash

# 交互式模式
python mycli.py
# 提示:你的名字: [默认值]
# 输入名字后输出问候# 命令行指定参数
python mycli.py --count 3 --name Alice
# 输出三次 "Hello, Alice!"
核心功能
  • 装饰器语法:通过 @click.command() 和 @click.option() 定义命令和参数。
  • 交互式提示:自动处理用户输入(如 prompt='你的名字')。
  • 类型检查:自动处理参数类型转换。
  • 子命令:支持创建多级命令(如 git commitgit push)。

4. 其他传递方式

环境变量

通过 os.environ 获取环境变量,适合传递敏感信息(如 API Key):

python

运行

import osapi_key = os.environ.get('API_KEY')
if api_key:print(f"使用 API Key: {api_key}")
else:print("未设置 API_KEY 环境变量")
配置文件

读取外部配置文件(如 JSON、YAML):

python

运行

import jsonwith open('config.json', 'r') as f:config = json.load(f)print(f"配置: {config}")
管道输入

通过标准输入(stdin)接收数据:

python

运行

import sys# 读取所有输入行
for line in sys.stdin:print(f"处理: {line.strip()}")

使用示例

bash

echo "hello" | python myscript.py

选择建议

场景推荐方式
简单脚本,少量参数sys.argv
复杂命令行工具argparse
优雅的 CLI 界面click
敏感信息或全局配置环境变量
大量配置参数配置文件

总结

  • sys.argv:适合简单脚本,直接获取原始参数列表。
  • argparse:标准库,功能全面,适合中型工具。
  • click:第三方库,语法简洁,适合构建专业 CLI 工具。
  • 环境变量 / 配置文件:适合传递非命令行参数(如密钥、路径)。

根据需求选择合适的方式,能让你的脚本更易用、更健壮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90059.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90059.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90059.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+springboot 的车险理赔信息管理系统

源码、数据库、包调试源码编号&#xff1a;S595源码名称&#xff1a;基于springboot 的车险理赔信息管理系统用户类型&#xff1a;多角色&#xff0c;用户、事故调查员、管理员数据库表数量&#xff1a;14 张表主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven运…

MyDockFinder 绿色便携版 | 一键仿Mac桌面,非常简单

如果你既不想升级到Win11&#xff0c;又想体验Mac桌面的高级感&#xff0c;那么MyDockFinder将是你的最佳选择。这是一款专为Windows系统设计的桌面美化工具&#xff0c;能够将你的桌面转变成MacOS的风格。它提供了类似Dock栏和Finder的功能&#xff0c;让你在不更换操作系统的…

Babylon.js 材质克隆与纹理共享:你可能遇到的问题及解决方案

在 Babylon.js 中&#xff0c;材质&#xff08;Material&#xff09;和纹理&#xff08;Texture&#xff09;的克隆行为可能会影响渲染性能和内存管理&#xff0c;尤其是在多个材质共享同一纹理的情况下。本文将探讨&#xff1a;PBRMetallicRoughnessMaterial 的克隆机制&#…

信息素养复赛模拟1和模拟2的编程题标程

信息素养复赛模拟 11&#xff1a;楼层编号 #include<bits/stdc.h> using namespace std; int main(){int n, t;cin >> n >> t;int res 0;for(int i 1; i < n; i ){int x i;bool ok true;while(x){if(x % 10 t){ok false;}x / 10;}res ok;} cout &l…

Hadoop高可用集群搭建

Hadoop高可用(HA)集群是企业级大数据平台的核心基础设施&#xff0c;通过多主节点冗余和自动故障转移机制&#xff0c;确保系统在单点故障时仍能正常运行。本文将详细介绍如何基于CentOS 7搭建Hadoop 3.X高可用集群&#xff0c;涵盖环境准备、组件配置、集群启动及管理的全流程…

Next.js 实战笔记 1.0:架构重构与 App Router 核心机制详解

Next.js 实战笔记 1.0&#xff1a;架构重构与 App Router 核心机制详解 上一次写 Next 相关的东西都是 3 年前的事情了&#xff0c;这 3 年里 Next 也经历了 2-3 次的大版本变化。当时写的时候 Next 是 12 还是 13 的&#xff0c;现在已经是 15 了&#xff0c;从 build 到实现…

Pillow 安装使用教程

一、Pillow 简介 Pillow 是 Python 图像处理库 PIL&#xff08;Python Imaging Library&#xff09;的友好分支&#xff0c;是图像处理的事实标准。它支持打开、编辑、转换、保存多种图像格式&#xff0c;常用于图像批量处理、验证码识别、缩略图生成等应用场景。 二、安装 Pi…

SQL Server从入门到项目实践(超值版)读书笔记 20

9.4 数据的嵌套查询所谓嵌套查询&#xff0c;就是在一个查询语句中&#xff0c;嵌套进另一个查询语句&#xff0c;即&#xff0c;查询语句中可以使用另一个查询语句中得到的查询结果&#xff0c;子查询可以基于一张表或者多张表。子查询中常用的操作符有ANY、SOME、ALL、IN、EX…

【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案

【MySQL\Oracle\PostgreSQL】迁移到openGauss数据出现的问题解决方案 问题1&#xff1a;序列值不自动刷新问题 下面SQL只针对单库操作以及每个序列只绑定一张表的情况 -- 自动生成的序列&#xff0c;设置序列值 with sequences as (select *from (select table_schema,table_…

【Maven】Maven命令大全手册:28个核心指令使用场景

Maven命令大全手册&#xff1a;28个核心指令使用场景 Maven命令大全手册&#xff1a;28个核心指令深度解析一、构建生命周期核心命令1. mvn clean2. mvn compile3. mvn test4. mvn package5. mvn install6. mvn deploy二、依赖管理命令7. mvn dependency:tree8. mvn dependency…

大语言模型(LLM)按架构分类

大语言模型&#xff08;LLM&#xff09;按架构分类的深度解析 1. 仅编码器架构&#xff08;Encoder-Only&#xff09; 原理 双向注意力机制&#xff1a;通过Transformer编码器同时捕捉上下文所有位置的依赖关系# 伪代码示例&#xff1a;BERT的MLM任务 masked_input "Th…

MySQL(120)如何进行数据脱敏?

数据脱敏&#xff08;Data Masking&#xff09;是指通过某种方式对敏感数据进行变形&#xff0c;使其在使用过程中无法识别原始数据&#xff0c;从而保护数据隐私。数据脱敏通常应用在开发、测试和数据分析等场景中。下面我们详细介绍如何在Java应用程序中进行数据脱敏&#xf…

使用 Dockerfile 构建基于 .NET9 的跨平台基础镜像

官方基础镜像准备 微软官方 dotnet sdk 基础镜像&#xff1a; docker pull mcr.microsoft.com/dotnet/sdk:9.0拉取 ubuntu 镜像&#xff1a; docker pull ubuntu:24.04更多资源请参考&#xff1a; dotnet sdk images&#xff0c;https://mcr.microsoft.com/en-us/artifact/mar/…

C++ : 线程库

C : 线程库一、线程thread1.1 thread类1.1.1 thread对象构造函数1.1.2 thread类的成员函数1.1.3 线程函数的参数问题1.2 this_thread 命名空间域1.2.1 chrono二、mutex互斥量库2.1 mutex的四种类型2.1.1 mutex 互斥锁2.2.2 timed_mutex 时间锁2.2.3 recursive_muetx 递归锁2.2.…

idea的使用小技巧,个人向

idea的使用小技巧&#xff0c;个人向 一、前言二、过程1、显示内存的使用情况2、去掉xml文件中的黄色背景3、显示所有打开文件4、显示工具栏到菜单下面5、使用JDK8 一、前言 每次重装idea都需要重新设置一下&#xff0c;这里做个记录。 这些技巧只是个人感觉的好用 演示用的…

debian及衍生发行版apt包管理常见操作

好的&#xff0c;这是 Debian 及其衍生版&#xff08;如 Ubuntu&#xff09;使用的 apt 包管理器的常用命令速查表。 一点说明&#xff1a;apt 是新一代的命令行工具&#xff0c;整合了 apt-get 和 apt-cache 的常用功能&#xff0c;并提供了更友好的交互体验。本表主要使用现…

vue调用函数

好的&#xff0c;我们来讲解如何在 Vue 模板中调用函数。您提供的代码是一个非常棒的、很实用的例子。 在 Vue 模板中&#xff0c;你可以在两个主要地方调用函数&#xff1a; 文本插值中&#xff1a;像 {{ formatDate(date) }} 这样&#xff0c;函数的返回值会作为文本被渲染到…

前端常用构建工具介绍及对比

打包构建工具是现代软件开发中必不可少的,它们帮助开发者自动化构建、打包、部署等流程,提升开发效率。不过,不同时期构建工具略有差异。 每个构建工具都有其擅长的领域,我们需要知道其优势,才能在我们实际开发中选择合适的构建工具进行构建处理。 1. Gulp Gulp 是一个…

Web后端开发-SpringBootWeb入门、Http协议、Tomcat

文章目录Web后端开发简介SpringBootWeb入门HTTP协议HTTP-概述HTTP-请求协议HTTP-响应协议HTTP-协议解析Web服务器-Tomcat简介基本使用SpringBootWeb入门程序解析Web后端开发简介 SpringBootWeb入门 package com.wuxuan.javaweb_wushuang.controller;import org.springframework…

物联网通信技术全景剖析:从LoRa到5G的深度对比与选型指南

物联网通信技术全景剖析&#xff1a;从LoRa到5G的深度对比与选型指南在万物互联时代&#xff0c;选择合适的通信技术如同为设备构建“神经网络”。本文将深入解析七大主流物联网通信技术&#xff0c;助您在技术选型中精准决策。一、低功耗广域网&#xff08;LPWAN&#xff09;技…