心形图Python代码详细解析

心形图Python代码详细解析

  • 源代码

    print('\n'.join([''.join([('pikachu'[(x-y)%7]\
                               if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 \
                               else' ')\
                              for x in range(-30,30)])\
                     for y in range(15,-15,-1)]))
    

    图形如下
    在这里插入图片描述

  • 预备知识

    • join()函数

      • 语法式 str.join(sequence)
        • str为用于分隔sequence的字符

        • sequence为用于拼接的对象,它可以是字符串、列表、元组、字典

      • 具体演示
        • 连接列表
        str = '+' #定义加号来进行分隔
        
        sequence = ['a','b','c'] #定义sequence为列表
        
        print(str.join(sequence))
        #输出的结果为 a+b+c
        
        • 连接字符串
        str = '+' #定义加号来进行分隔
        
        sequence = 'hello world' #定义sequence为字符串
        
        print(str.join(sequence))
        #输出的结果为 h+e+l+l+o+ +w+o+r+l+d
        
        • 连接字典的键
        str = '+' #定义加号来进行分隔
        #对于字典join只会连接键
        sequence = {'1':'2','a':'b'} #定义sequence为字典
        
        print(str.join(sequence))
        #输出的结果为 1+a
        
        • 连接元组

          str = '+' #定义加号来进行分隔
          #对于字典join只会连接键
          sequence =  ('a','b','c') #定义sequence为元组
          
          print(str.join(sequence))
          #输出的结果为 a+b+c
          #元组与列表的区别
          '''
          1.元组和列表都属于序列。
          2.列表属于可变序列,它的元素可以随时修改或者删除,而元组属于不可变序列,其中的元素是不能修改的,除非整体重新赋值。
          3.列表可以使用多种方法实现添加和修改列表元素,而元组没有办法,因为不能想元组中添加或修改元素,同样也不能删除元素
          4.列表可以使用切片方法访问和修改列表中的元素,元组也支持切片,但是它只支持通过切片访问元组中的元素,不支持修改
          5.元组比列表中的访问和处理速度更快,所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组。
          列表不能作为字典类型中的键,而元组是可以的。
          '''
          
    • 字符串单个字母的表示
      str = 'abc'
      str[2]
      #这会输出str的第三个字母c
      'efg'[2]
      #这会输出efg的第三个字母g
      
    • 列表推导式

      列表推导式(list comprehension)是指循环创建列表.

      # 正常的循环结构创建数列
      list_a = list()
      for a in range(5):
          list_a.append(a)
      print(list_a)
      
      # 列表推导式创建数列
      list_b = [b for b in range(5)]
      print(list_b)
      
      #两者的结果是一样的,但是列表推导式更加简介
      #列表推导式更像是一种倒叙的写法,同时把循环或if时的:给省略了
      
    • 心形函数,对 x x x y y y除以一个小数可调整心得长宽

      ( x 2 + y 2 − 1 ) 3 + x 2 y 3 = 0 (x^{2}+y^{2}-1)^{3}+x^{2}y^{3}=0 (x2+y21)3+x2y3=0

在这里插入图片描述

  • 具体解析

    • 源代码对齐

      print(
          '\n'.join
              ([
              ''.join
                  ([
                      (
                          'pikachu'[(x-y) % 7]
                          if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' '
                      )   for x in range(-30, 30)
                  ])
                      for y in range(15, -15, -1)
              ])
           )
      
    • 源代码正序推导
      result = '' #result用于收集每一行的字符串
      for y in range(15,-15,-1): #这里的数字的改变可以改变心的位置,y代表纵轴
          row = '' #row在于收集一行中的每个字符
          for x in range(-30,30): #这里的数字的改变可以改变心的位置,x代表横轴
              if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0: #改变这里的0.1 0.05可以改变心的窄宽
                  row += 'pikachu'[(x-y)%7] 
                  #(x-y)%7使得按照顺序每次都截取 pikachu的字符 这里的7换成len(pikachu)会更好
              else:
                 row += ' ' #若不在心内则用空格代替
          result = result + '\n' + row
      print(result)
              
      
    • 总结

      心形图的核心其实在于心形公式的使用,上面的代码中利用心形公式的限制,若在心内则显示,若不在则用空白代替

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值