写错 Python 部分代码,结果让我想不明白

crella:问题比较难描述。我是新手,本来我是用 Ruby 写全排列算法生成器的,然后想看 Python 怎么写。我不懂 Python,所以看别人怎么用 yield 也就随便用。问题出在我写错的最后一句:print(','.join(str(o))),打印的结果我实在看不懂,或许是我不懂 yield 的流程。是我的 yield 哪里写错了吗?

# 生成数组[1,2,3,4]的全部元素的全排列
def scan(src, m, n):
  if (m == n):
    yield src
  else:
    for i in range(m, (n+1)):
      # 交换
      tmp = src[m]
      src[m] = src[i]
      src[i] = tmp
      
      # 递归
      for _ in scan(src, (m+1), n):
        yield _
      
      # 恢复交换前
      tmp = src[m]
      src[m] = src[i]
      src[i] = tmp   
  


def perm_core(src):
  n = len(src) - 1
  for _ in scan(src, 0, n):
    yield _


# main
list = [i for i in range(1, 5)]
for o in perm_core(list):
  # ~ w = [str(y) for y in o]
  # ~ print (','.join(w)) # 正确代码
  
  print(','.join(str(o))) # 错误代码

打印结果

写错 Python 部分代码,结果让我想不明白

binux:你不懂 join

Pagliacii:https://sm.ms/image/G54yMndwJrOcEgN

问题在于你直接将列表作为参数传给了 str,结果就如图所示了

superrichman:你的问题楼上说了,传给 str 的参数有问题,你需要对列表里每一个元素转 str 而不是整个列表转 str 。

其实需要字符串的列表在列表生成的时候就可以转了,比如把 i 改成 str(i)
list = [str(i) for i in range(1, 5)]
不过变量不要取名为 list,这会和 python 内置的 list 函数冲突,可能会引起其它问题。

python 内置模块有排列组合的功能, 可以去搜索关键字 itertools permutation combination,内置的实现一般运行效率会比自己写的高

python 交换变量的值,可以不用自己声明临时变量,直接
a, b = b, a
完成交换

Python 哪个库求反三角函数能返回角度值?

Hlianbobo:python 哪个库求反三角函数能返回角度值?网上查了结果返回的都是弧度值RockShake:转换一下就好了啊 SingeeKing:你的初中数学老师棺材板该压不住了… 她绝对讲过弧度和角度的换算 way2explore2:对的同一楼上,自己转换 jinliming2:角度=弧度*180/π Mindjet:@SingeeKing #2 …

Python 如何查某关键词在百度网页第几页?

cizimo:例如,在百度搜索 XXX 关键词后,想知道包含 YYY 的词在搜索结果的第几页? 这个能做到吗? 或者说有没有教程,砸一个链接给我呗,谢谢大家啦

Python 有没有监听鼠标点击网页相关元素的包呢?

18870715400:具体需求 比如说打开了 www.baidu.com ,当你鼠标点击了“百度一下”就可以获得这个对应的 id 或者是对应的 xpath 语法 如果没有对应的包,那么有什么可以具体实现的思路呢?

Python 现在最好用的包管理是啥?

maichael:最近为了给测试搭自动化测试,重新开始搞起 Python,但是整体工程结构比较苦恼。 重点是版本管理,requirements.txt 感觉不怎么好用。Pipenv? Tox? 还是其它的啥? 以及像 package.json 里 scripts 的用法,python 有类似的吗?cdyrhh:poetry

Python 如何优雅地处理子线程异常?

Te11UA:目前比较多的做法还是如下,出于担心未知异常、没有记录日志就退出子线程的情况下,在函数用一个大的 try-except 来进行 handle,或者是将主要逻辑放到 test_sth 中,使用 try-except 来捕获: def run(): try: test_sth() ... except Exception: log_exception…