Python学习过程中常见问题与解决方案

def count():

fs = []
for i in range(1, 4):
    def f():
         return i*i
    fs.append(f)
return fs

f1, f2, f3 = count()

这个代码中 为什么单独运行 f1=count ()会报错呢 typeerror

还有就是为什么 f1 , f2=count () 也会报错 valueerror

为什么这 2 个报错还不一样呢


Python学习过程中常见问题与解决方案

10 回复

语法并没有错误,在 Python 3.5 中没有报错。


Python学习常见问题与解决方案

1. 环境配置与包管理

  • 问题pip install 失败,提示版本冲突或权限错误。
  • 解决
    • 使用虚拟环境:这是最佳实践,能隔离项目依赖。
      # 创建虚拟环境
      python -m venv myenv
      # 激活 (Windows)
      myenv\Scripts\activate
      # 激活 (macOS/Linux)
      source myenv/bin/activate
      
    • 使用 pip--user 标志(无虚拟环境时):pip install --user package_name
    • 指定国内镜像源加速pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name

2. 编码与解码 (Unicode)

  • 问题:处理文件或网络数据时出现 UnicodeDecodeError 或乱码。
  • 解决:明确指定编码。读写文件时使用 encoding 参数。
    # 读取文件,指定编码(如UTF-8)
    with open('file.txt', 'r', encoding='utf-8') as f:
        content = f.read()
    # 写入文件
    with open('output.txt', 'w', encoding='utf-8') as f:
        f.write('一些内容')
    
    • 对于来源不明的数据,可尝试常见编码如 'utf-8''gbk''latin-1'
    • 使用 requests 库获取网页时,它通常会自动处理编码。

3. 可变对象作为函数默认参数

  • 问题:函数使用可变对象(如列表、字典)作为默认参数,多次调用后该参数会“记忆”之前的结果。
  • 解决永远不要使用可变对象作为默认参数。使用 None 代替,并在函数内部初始化。
    # 错误示例
    def append_to(element, target=[]):
        target.append(element)
        return target
    # 多次调用后,target 默认值会累积
    
    # 正确做法
    def append_to_fixed(element, target=None):
        if target is None:
            target = []
        target.append(element)
        return target
    

4. 模块导入错误 (ModuleNotFoundError)

  • 问题import my_module 失败。
  • 解决
    1. 检查当前工作目录和PYTHONPATH:确保你的模块文件(.py)所在目录在Python的搜索路径中。可以使用 sys.path 查看。
    2. 相对导入与绝对导入:在包(有 __init__.py 的目录)内,使用明确的导入路径。
      • 绝对导入:from my_package import my_module
      • 相对导入(在包内部):from . import sibling_module
    3. 检查 __init__.py:确保包目录下存在此文件(可以是空的)。

5. 浅拷贝与深拷贝

  • 问题:修改一个列表/字典后,另一个“复制”的列表/字典也意外被修改。
  • 解决:理解赋值、浅拷贝(copy())和深拷贝(deepcopy())的区别。
    import copy
    
    original = [[1, 2], [3, 4]]
    # 赋值:只是引用同一个对象
    assigned = original
    # 浅拷贝:只复制最外层,内层列表仍是引用
    shallow_copied = original.copy()  # 或 list(original), original[:]
    # 深拷贝:递归复制所有嵌套对象
    deeply_copied = copy.deepcopy(original)
    
    original[0][0] = 99
    print(assigned)        # [[99, 2], [3, 4]] -> 变了
    print(shallow_copied)  # [[99, 2], [3, 4]] -> 内层也变了!
    print(deeply_copied)   # [[1, 2], [3, 4]]  -> 完全独立,没变
    
    • 规则:当对象包含嵌套的可变对象时,如果需要完全独立的副本,使用 copy.deepcopy()

6. 循环中修改迭代对象

  • 问题:在 for item in some_list: 循环内部修改 some_list(如删除元素),可能导致意外跳过元素或错误。
  • 解决不要在遍历时直接修改原列表。创建副本进行遍历,或使用列表推导式、filter 生成新列表。
    # 错误示例(可能跳过元素)
    numbers = [1, 2, 3, 4, 5]
    for num in numbers:
        if num % 2 == 0:
            numbers.remove(num) # 危险!
    
    # 方法1:遍历副本,操作原列表
    numbers = [1, 2, 3, 4, 5]
    for num in numbers[:]: # 使用切片创建副本
        if num % 2 == 0:
            numbers.remove(num)
    
    # 方法2(推荐):使用列表推导式创建新列表
    numbers = [1, 2, 3, 4, 5]
    numbers = [num for num in numbers if num % 2 != 0]
    

7. 文件路径与工作目录

  • 问题:使用相对路径 open('data.txt') 时,脚本在不同位置运行会找不到文件。
  • 解决
    • 使用绝对路径:硬编码或从配置文件读取。
    • 基于脚本位置构建路径:使用 __file__ 获取当前脚本的绝对路径,然后用 os.path 模块操作。
      import os
      # 获取当前脚本所在目录
      script_dir = os.path.dirname(os.path.abspath(__file__))
      # 构建目标文件的绝对路径
      file_path = os.path.join(script_dir, 'data', 'myfile.txt')
      with open(file_path, 'r') as f:
          # ...
      
    • 使用 pathlib (Python 3.4+,更现代)
      from pathlib import Path
      script_dir = Path(__file__).parent
      file_path = script_dir / 'data' / 'myfile.txt'
      with open(file_path, 'r') as f:
          # ...
      

总结建议:多写多练,善用官方文档和 print()/调试器排查问题。

f1, f2=count() 这个很好理解
正常来说 f1-3 三个变量,返回值是 3 函数的 list
正好一一对应
现在你只给两个变量,对应不上

我是在 python2.7 上运行这个的 单独运行 f1=count ()就报错了

记得在 Python Cookbook 第一章第一节就是讲的这个例子, 函数返回多值的 Unpacking 问题.

f1, f2 = … 这样表示左侧是一个 tuple 要对应于右侧也是一个 tuple/或可转换的结构, 而且长度要求为 2, 否则报 ValueError



若执行 f1=count() 我这里测试也没问题, 结果用 f1[1] f1[2] 访问,
系统版本是 2.7 (sys.version_info(major=2, minor=7, micro=12, releaselevel=‘final’, serial=0))

  1. 2.7.11 测试不报错。
    2. 三个列表是不能平均分给两个变量的。
    3. 在循环里重复创建同样的函数真的好吗。。

可以加我们的群问,这样效率更高,这个群是一群工程师组建的面向初学者的 python Linux 学习群, qq 群号: 278529278 ,非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex

错误提示能给一下吗?

typeerror :‘ list ’ object is not callalbe

我怀疑楼主不是用 f1=count(), 而是 f1=count()()

回到顶部