鱼C论坛

 找回密码
 立即注册
查看: 197|回复: 3

[已解决]get_char(*a) 中的*是什么意思呢?

[复制链接]
发表于 2024-7-14 16:44:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from PIL import Image
def main(IMG):
    WIDTH=160
    HEIGHT=80
    lst=list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,")

    def get_char(r,g,b,alpha=256):
        if alpha==0:
            return ' '
        lenght=len(lst)
        gray=int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        unit=256/lenght
        return lst[int(gray/unit)]

    im=Image.open(IMG)
    im=im.resize((WIDTH,HEIGHT),Image.NEAREST)

    txt=''
    for i in range(HEIGHT):
        for j in range(WIDTH):
            a=im.getpixel((j,i))
            print(a)
            #txt += get_char(*a)
            txt += get_char(a)
        txt += '\n'
    print(txt)

main(IMG=input('请输入图片地址 :'))
在上述代码中txt += get_char(*a) 去掉* 运行会显示如下错误:
txt += get_char(a)
TypeError: get_char() missing 2 required positional arguments: 'g' and 'b'
这个*是什么意思呢?
最佳答案
2024-7-14 17:06:33
本帖最后由 smallwh 于 2024-7-14 17:10 编辑

txt += get_char(*a) 中 * 表示对序列进行解包,将序列中的每一个元素作为一个参数传入,说白了就是拆开序列
get_char(*a) 就好比 get_char(a[0],a[1],a[2],...,a[len(a)-1]) 【但不能这样写】
例子如下:
#func 函数打印传入参数的数量,并输出传入的参数
>>> a = [1,2,3]
>>> func(a)
传入1个参数
[1, 2, 3]
>>> func(*a)
传入3个参数
1 2 3

下面是 func 函数的代码,里面便有用 * 解包的例子
def func(*args): #传入不确定数量的参数的写法
    print('传入{}个参数'.format(len(args))) #得到的args是一个元组
    print(*args) #对元组解包并打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-14 16:44:22 | 显示全部楼层
这个\*符号在函数调用中的作用是“解包”一个序列或可迭代对象,将其元素作为单独的参数传递给函数。说得通俗点,就是把一个装着多个元素的箱子拆开,然后把里面的元素一个个地拿出来,分别送入函数中。

在你的例子中,`a`是`im.getpixel((j, i))`返回的一个包含颜色信息的元组,通常包含红、绿、蓝和可能的透明度值(即RGBA)。例如,`a`可能是这样的:(255, 128, 64, 255)。

来看一下你的 `get_char` 函数定义:
def get_char(r, g, b, alpha=256):
    # 你的代码...

它期望接收4个参数:r、g、b和alpha,如果alpha没有传递,则使用默认值256。假设你得到了一个包含4个元素的元组`a`,那么`*a`会将这个元组拆开成4个独立的参数,分别传递给`get_char`。

举个搞笑的小例子,假设你有一个装满水果的篮子`basket = ["apple", "banana", "cherry"]`,再假设你有一个函数`eat_fruit(a, b, c)`,如果你直接调用`eat_fruit(basket)`,就等于试图把整个篮子塞到一个人的嘴里,而这显然是不行的!但如果你用`eat_fruit(*basket)`,相当于把篮子里的苹果、香蕉、樱桃拆开,一个一个喂到嘴里,这样就舒服多了。

所以,在你的代码中,`txt += get_char(*a)`就是在把`a`中的每个值(r、g、b、alpha)分别送到`get_char`函数的对应参数位置上。如果你去掉`*`,就会试图把整个元组作为一个单独参数传递,而`get_char`需要的是4个分开的参数,这样就会报错。

希望这个解释能让你更好地理解`*`的作用,记住:`*` 就是帮你拆箱子的好帮手,能让你避免一堆手动拆箱子的麻烦。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-14 17:06:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 smallwh 于 2024-7-14 17:10 编辑

txt += get_char(*a) 中 * 表示对序列进行解包,将序列中的每一个元素作为一个参数传入,说白了就是拆开序列
get_char(*a) 就好比 get_char(a[0],a[1],a[2],...,a[len(a)-1]) 【但不能这样写】
例子如下:
#func 函数打印传入参数的数量,并输出传入的参数
>>> a = [1,2,3]
>>> func(a)
传入1个参数
[1, 2, 3]
>>> func(*a)
传入3个参数
1 2 3

下面是 func 函数的代码,里面便有用 * 解包的例子
def func(*args): #传入不确定数量的参数的写法
    print('传入{}个参数'.format(len(args))) #得到的args是一个元组
    print(*args) #对元组解包并打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-14 17:53:50 | 显示全部楼层
解包可迭代对象,将其元素作为单独的参数传递给函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表