Lv.1
所有的程序员都是导演,所有的计算机都是烂演员。它们只会按照你编的程序严格执行,而不是按照你想的做……
在 【Python作品分享】m【作品秀】 中回复
我建议你学一下numpy库,这里面定义了一个数据类型很喵,就是ndarray,相当于多层嵌套的列表,但用它来运算速度比列表快个几十倍(甚至100倍)。里面还有一些方法很方便编程。
2022-08-01T14:26:28 点赞:1
在 我和某某的交流区 中回复
找零
import math
import turtle
import time
target = float(input('找零(元):'))
M = [喵, 0.5, 0.1]
N = [0, 0, 0, 0, 0, 0, 0, 0]
for i in range(8):
N[i] = math.floor(target / M[i])
target = (target % M[i])
print(M[i], '元纸币', N[i], '张')
t = turtle.Pen()
time.sleep(1)
t.hideturtle()
t.speed(0)
t.pensize(5)
C = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'gray', 'black']
n = 0
for i in range(8):
n = (n + N[i])
t.penup()
t.goto((-100), 0)
t.pendown()
for i in range(8):
t.color(C[i])
t.forward(((200 * N[i]) / n))
time.sleep(1)
不过我发现很多我觉得太无聊的作品我都删了……
2022-08-15T15:45:27 点赞:1
在 我和某某的交流区 中回复
P1.0 关于注释
# 首先,像这样在行首或某行代码后加“#”的,在“#”之后直至行末的所有内容均为注释,不会被运行
# 注释可以方便自己和他人浏览代码,了解某部分代码是在做什么
# 如果一个作品很久不看,且没有注释,那么可能作者自己都会蒙(亲测)
# 要养成写注释的习惯(重要部分才写,但是为了教学,我会加上更多注释)
# 注释一般是在某几行代码前的一行上写,表示此块代码的作用;或是在某一行的后面写,说明本行代码的作用
2022-08-15T16:04:53 点赞:1
在 我和某某的交流区 中回复
P1.1 交互(输入/输出函数)
print() # print译为打印,会将括号里的内容输出给你看,每次print会自动转行
# 在海龟编辑器里就是在最下面深蓝色区域(终端区)显示print的内容
input() # input译为输入,会在终端区出现光标,你可以在上面输入一些东西,并按回车结束输入
# input的括号里可以写上提示并显示在终端区(相当于用一次print)
2022-08-15T16:14:22 点赞:1
在 我和某某的交流区 中回复
P1.2.1 数据类型(上,单个的数据类型)
# python里定义了很多数据类型,比如最简单的整数int、浮点数(一定位数精度的小数)float、字符串str。
# 想要看输出结果,还是要用到print:
# int类型 整数
print(1)
print(-10)
# float类型 浮点数
print(-0.1)
print(3.141592653589793238462643383279502884197169399375105820974944) # 超过15位小数部分会被忽略,这叫舍入误差
# 科学计数法:“e”相当于“乘10的……次方”
print(1e9, -1414.213562373095e-3) # print支持同时输出多个结果,用逗号隔开
# str类型 字符串:一般用英文状态下的单引号或双引号框住,内容可以是任意的英文字母、数字、符号(部分符号如转行等特殊的符号后面会讲)
print('abc123xyz890')
print('1.732050808') # 注意这不是float类型,是一个str!是不能进行计算的。
print("Amy's book") # 如果字符串中出现英文的单引号,则需用双引号
# 双引号会优先于单引号,即计算机若识别到双引号,则里面不管多少个单引号也是看作字符串的一部分
# 小练习:试着运行 print('\'),出现报错?上网查“转义字符”了解一下
print() # 可以通过打印“什么都没有”来实现空行,因为每一次print()都会默认转行,这些应该能自己想到
# 文本字符串:用三对单引号或双引号框住,内容可以有换行
a = '''# 注意⚠️在文本字符串中注释会看成文本的一部分!
数*****了:"这些你会吗?"
我**学:"我能说不会吗?"
数*****了:"……"
这时出现反斜杠\就不会报错了
''' # 这里是把这个文本字符串赋值给a,之后会讲到变量赋值
# 在文本字符串内任何字符都会直接保存原来的样子,不会出现任何报错
print(a)
# complex类型 复数(不是英语课上的复数):虚数单位“i”要用“j”或大写“J”替换,且j前一定要带上数字(整数或浮点数)
print(1048576j, (-0.7071067811865476+0.7071067811865476J)) # 一个complex包含实部 real part 和虚部 imaginary part,且用小括号括起来表示一个整体,用+或-连接
# 如果不用括号括起来则会视为一个浮点数和一个实部为0的复数相加(减),不过结果都一样
# 试着运行 print(j) 和 print(1-j),报错?那是因为j前一定要带数字,否则无法识别为虚数单位,这里要改为1j
2022-08-15T18:22:11 点赞:1
在 我和某某的交流区 中回复
P1.2.1 输出参考:
1
-10
-0.1
3.喵9793
1000000000.0 -1.414213562373095
abc123xyz890
1.732050808
Amy's book
# 注意⚠️在文本字符串中注释会看成文本的一部分!
数*****了:"这些你会吗?"
我**学:"我能说不会吗?"
数*****了:"……"
这时出现反斜杠\就不会报错了
1048576j (-0.7071067811865476+0.7071067811865476j)
2022-08-15T20:27:56 点赞:1
在 我和某某的交流区 中回复
P1.3 变量赋值(不得不提前讲的一节课)
# 都怪我,没有调好课程顺序,我发现要继续讲下去必须先讲赋值
# 首先讲一下变量
# 变量就是一个可以存储一个数据的容器
# 可以将有用的数据存储起来方便后续使用,也可以参与运算
# 变量的命名规则:
# 1. 变量名的字符只能由26个英文字母、数字0~9、下划线“_”组成
# 2. 变量名首个字符不能为数字(可以是下划线)
# 3. 变量名的英文字母区分大小写,如变量a和A是不同的两个变量
# 4. 推荐起名字的时候变量名要具体一点,最好能说明表示什么,而且长一点便于区分,不要遇到什么就取a, b, c, n, x, y, z等基本无信息量的名字,不要嫌麻烦(本人亲测)
# 变量的赋值
# 在python语法里要命名一个变量并对其赋值的结构:变量名 = 数据
# 一个等号就表示将等号右边的数据赋值给左边的变量
# 如:
n1, n2 = 0, 1 # 一般数字用来编号;可以用逗号隔开分别赋值
a_complex_number = 1-2J # 一般下划线在变量里充当空格的意思,若一个变量要用几个单词才能表达,就可以用下划线
# 那么在这两行代码之后就可以直接打出变量名使用这些变量了:
print(n2, n1)
print(a_complex_number)
# 变量可以再赋值以修改:
a_complex_number = -1+2J
print(a_complex_number) # 然后这个变量就变成新的值了
n1 = '0' # 还可以改变数据类型。本来n1是整型的,改为字符串不会报错(很多语言是不支持这么做的,直接报错)
print(n1)
# 想要交换两个变量的值怎么办?
# 正常想到的方法就是:
tamp = n1
n1 = n2
n2 = temp
# 其实用之前逗号隔开分别赋值的方法可以实现
n1, n2 = n2, n1 # 其实内部运行的原理,就是python运行时等号右边会先被视为一个元组,即(n2, n1),再将其对应元素分别赋值给n1和n2
# 最后聊一聊,比较一下python和其他语言的不同之一:
# python的变量赋值是其一大亮点
# 以前的很多编程语言(如C、C++、Java)都是静态类型的语言,
# 即里面的一个变量在定义时就要告诉计算机它的数据类型是什么,在定义后不能改变其数据类型,要改变只能定义一个不同数据类型的新变量
# 而python里面的变量是动态的,即可以随时改变
# 便捷是便捷,但这样做也会有损失,python既然是动态的,那每次运行变量都要检测数据类型,运算速度自然就比静态类型语言慢了
2022-08-16T17:29:51 点赞:1
在 【Python作品分享】Newton's Fractal_牛顿分形【作品秀】 中回复
这个是修改后的,其中在 get_index 中有一部分注释提供了另一种上色的算法,没注释的是默认算法,改成另一种算法同时要改动后面的少许内容,不懂的不建议改,想尝试的可以试着理解代码,然后自己改。
import numpy as np
import pygame
import sys
iter = 20 # iterations
roots = np.array([1.0+0.0j, -0.5+0.8660254037844386j, -0.5-0.8660254037844386j], dtype='c16')
# roots = np.array([1.5+0.0j, -0.75+0.5j, -0.75-0.5j], dtype = 'c16')
def f(x):
a, b, c = x-roots[0], x-roots[1], x-roots[2]
return x-a*b*c/(a*b+b*c+c*a)
def get_z(x):
for i in range(iter):
x = f(x)
return x
def get_index():
x0 = np.resize(np.linspace(-focus, focus, pl, dtype='c16'), (pl, pl))
x0 = x0+x0.T*1j+middle # initial values
z = get_z(x0) # calculate limities
# calculate colors (Here are two methods)
# zc = np.zeros(shape=(pl, pl, 3), dtype='u1')
# npsum = np.sum
# for i in range(pl):
# for j in range(pl):
# w = 1/(abs(roots-z[i][j])+1e-3)
# zc[i][j] = w/npsum(w)
C = ((1, 0, 0), (0, 1, 0), (0, 0, 1))
zc = np.zeros(shape=(pl, pl, 3), dtype='u1')
for i in range(pl):
for j in range(pl):
dt = [abs(root-z[i][j]) for root in roots]
c = 0
for k in range(1, 3):
if dt[c] > dt[k]:
c = k
zc[i][j] = C[c]
return zc
pygame.init()
rslt = 200 # resolution
middle = 0.0+0.0j
focus = 2
pl = 2*rslt+1 # real and imaginary part len
size = 200
d = size/rslt
screen = pygame.display.set_mode((2*size, 2*size))
pygame.display.set_caption("Newton's Fractal")
def render(zc):
for j in range(pl):
for i in range(pl):
pygame.draw.rect(screen, 255*zc[i][j], (j*d, 2*size-i*d, d, d), 0)
pygame.display.update()
button_size = 7
def draw_button(touched_index=-1):
i = 0
for pos in (roots_cpos):
pygame.draw.circle(screen, (255, 255, 255),
(pos.real, pos.imag), button_size, 2)
i += 1
pygame.display.update()
char = 'roots = {}, focus = {}, middle = {}'.format(roots, focus, middle)
print(char+' '*(171-len(char)), end='\r')
def roots_trans(cpos):
return (cpos/size-(1+1j)).conjugate()*focus+middle
def roots_invtrans(cpos):
return size*(((cpos-middle)/focus).conjugate()+(1+1j))
roots_cpos = roots_invtrans(roots)
def check_pos(cpos):
is_touch_buttons = (abs(roots_cpos-cpos) <= 2*button_size)
for i in range(3):
if is_touch_buttons[i]:
return i
return -1
def set_rslt(val):
global rslt, pl, d
rslt = val
pl = 2*rslt+1
d = size/rslt
render(get_index())
draw_button()
down = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
iter += 1
elif event.key == pygame.K_DOWN:
if iter > 0:
iter -= 1
elif event.key == pygame.K_LEFT:
focus *= np.sqrt(2)
roots_cpos = roots_invtrans(roots)
elif event.key == pygame.K_RIGHT:
focus /= np.sqrt(2)
roots_cpos = roots_invtrans(roots)
elif event.key == pygame.K_f:
middle += (cpos.conjugate()/size-1+1j)*focus
roots_cpos = roots_invtrans(roots)
elif event.key == pygame.K_h:
focus, middle = 2, 0.0+0.0j
roots_cpos = roots_invtrans(roots)
elif event.key == pygame.K_g:
middle = np.mean(roots)
focus = np.max(abs(roots-middle))
roots_cpos = roots_invtrans(roots)
elif event.key == pygame.K_RETURN:
set_rslt(200)
elif event.key == pygame.K_SPACE:
set_rslt(50)
render(get_index())
draw_button()
elif event.type == pygame.MOUSEBUTTONUP:
down = 0
set_rslt(200)
render(get_index())
draw_button()
elif event.type == pygame.MOUSEBUTTONDOWN:
down = 1
set_rslt(50)
break
x, y = pygame.mouse.get_pos()
cpos = complex(x, y)
if down == 0:
index = check_pos(cpos)
else:
if index != -1:
roots_cpos[index] = cpos
roots[index] = roots_trans(cpos)
render(get_index())
draw_button()
# https://www.bilibili.com/video/BV1HQ4y1q78v?spm_id_from=333.337.search-card.all.click
# https://www.3blue1brown.com/lessons/newtons-fractal
2023-01-08T17:06:28 点赞:0