自由学习记录(64)
name = "abcdefg"
print(name[2:-1]) # 输出:'cdef'
解释:
name[2] 是 'c'
name[-1] 是 'g',所以切到 'f' 为止
即取:'c' 'd' 'e' 'f' → 'cdef'
xxx
s = "hello"
s.upper() # 返回 'HELLO'
xxxx
class Orange:
def __init__(self, a):
self.a = a
__init__ 是 Python 中的构造函数
self 是指类的实例对象
a 是外部传入的初始化参数
xxxx
Python 是支持多重继承的(不像 Java 会拒绝)
-
GeneralManager
继承自Manager
,而Manager
定义了salary
方法(哪怕是pass
也算) -
所以
GeneralManager
继承了该方法
xxx
模式 | 含义 |
---|---|
'r' | 只读 |
'r+' | ✅ 可读可写(不清空) |
'w' | 只写(清空或创建) |
'w+' | 可读写(清空或创建) |
'a' | 只追加写 |
'a+' | 可读可追加写 |
xxx
3*2 = 6
3**2 = 9
→ 6 > 9 → False
运算符 | 判断的是什么? | 用途 |
---|---|---|
== | 判断两个值是否相等 | “值是否一样” |
is | 判断两个变量是否指向同一对象(内存地址) | “是不是一个东西” |
xxx
Python 中集合(set
)的基本操作包括以下几种集合运算:
操作名称 | 符号 | 说明 |
---|---|---|
并集 | ` | 或 .union()` |
交集 | & 或 .intersection() | 获取两个集合都包含的元素 |
差集 | - 或 .difference() | 在一个集合中有、另一个没有的元素 |
xxxx
int → 整数(如 1, -5)
float → 浮点数(如 3.14, -0.001)
complex → 复数(如 3 + 4j)
这三种类型共同属于抽象基类 numbers.Number。
bool
是不是数字类型?
❌ 严格意义上,不是“数值类型”,但它是
int
的子类。
xxxxx
-
del
删除的是“名字”或“容器中的元素”,不一定马上释放内存 -
内存是否释放由 Python 的**垃圾回收机制(引用计数)决定
xxxxx
除了 '单引号'
和 "双引号"
,Python 还支持使用 三引号 定义多行字符串:
xxxx
网络爬虫是指自动从网络上爬取信息的程序或脚本
-
✅ 正确
-
这是网络爬虫的标准定义,例如使用
requests
+BeautifulSoup
/scrapy
来抓取网页内容。
数据分析中主要使用 pandas、numpy 和 scipy 库
-
✅ 正确
-
它们分别用于:
-
numpy
:数值计算、数组操作 -
pandas
:数据结构(DataFrame)、数据清洗与分析 -
scipy
:高级科学计算(如优化、积分、信号处理)
-
jieba库支持中文分词
-
示例用法:jieba
是 中文分词的代表性库,用途正是支持“中文文本分词”
import jieba
jieba.lcut("我喜欢Python编程")
→ ['我', '喜欢', 'Python', '编程']
PyQt5
是对 Qt 框架的 Python 封装,用于开发 GUI(窗口、按钮、菜单等图形界面)
xxx
类方法是使用 @classmethod
装饰器定义的绑定到类的函数,而不是实例。
第一个参数必须是 cls
,代表类本身(类似实例方法的 self
)。
f-string(最现代,Python 3.6+)
print(f"My name is {name}, I am {age} years old.")
xxxxx
try:
# 可能出错的代码
except SomeError:
# 捕获异常的处理代码
else:
# 没有发生异常时执行的代码(可选)
finally:
# 无论是否发生异常都会执行的代码(可选)
xxxx
-
li_one[:3]
:表示取列表li_one
的前三个元素(索引 0, 1, 2)。 -
sorted(..., reverse=True)
:对这三个元素进行排序,并按降序排列。
返回的是 li_one
的前三个元素的降序排序新列表,不会修改原列表。
xxx
xxxx
字符串"hello"[::-1]的结果是?("olleh" )
xxx
-
**kwargs
:表示 任意数量的“关键字参数” 会被收集成一个字典kwargs
。 -
kwargs
这个名字不是必须的,但**
是语法固定写法。 -
你可以向这个函数传入任意数量的
key=value
形式的参数。
参数类型 | 语法 | 参数形式 | 接收到的类型 |
---|---|---|---|
位置参数 | *args | func(1, 2, 3) | 元组 tuple |
关键字参数 | **kwargs | func(a=1, b=2) | 字典 dict |
import jsonjson_str = '{"name": "Alice"}'
data = json.loads(json_str)print(data) # 输出:{'name': 'Alice'}
print(type(data)) # 输出:<class 'dict'>
JSON 完全支持嵌套结构,包括嵌套字典、嵌套列表、甚至列表中嵌套字典等各种组合。Python 的 json.loads()
可以正常解析这些嵌套结构,最终转换为 Python 的对应数据类型。
import jsonjson_str = '''
{"name": "Alice","age": 30,"address": {"city": "Beijing","zip": "100000"},"hobbies": ["reading", "cycling"],"education": [{"level": "bachelor","major": "CS"},{"level": "master","major": "AI"}]
}
'''data = json.loads(json_str)
print(data["address"]["city"]) # 输出: Beijing
print(data["hobbies"][1]) # 输出: cycling
print(data["education"][0]["major"]) # 输出: CS
xxxx
函数内部 修改全局变量,必须使用 global
关键字来声明该变量是全局作用域中的。
x = 10def modify():global x # 声明 x 是全局变量x = 20modify()
print(x) # 输出:20
什么是 Python 虚拟机?
它是 Python 解释器的一部分,用来执行编译后的字节码(.pyc 文件),而不是直接执行你写的 .py
源代码。
你可以理解为它是一个在你电脑里运行的“软件 CPU”:
-
它不关心你原本写的代码是
print()
还是for
-
它只管一条一条“指令式”的字节码
-
就像真的 CPU 执行机器指令一样,它执行的是 Python 字节码指令
xxxx
xxx
class MyClass:def __init__(self):self.__secret = "Hidden"def reveal(self):return self.__secretobj = MyClass()
print(obj.reveal()) # ✅ 正常访问私有变量通过方法print(obj.__secret) # ❌ 会报错:AttributeError
xxx
assert 条件表达式, "可选的错误信息"
如果条件为 False,则抛出 AssertionError,并可附带消息。
xxx
finally
子句 总会执行,哪怕异常未被捕获或提前 return
。
实例方法可通过 实例调用;也可通过 类名显式调用,此时需手动传入实例:MyClass.method(obj)
。
from module import *
可一次性导入所有公开成员,调用时 无需模块名前缀;不推荐,易污染命名空间。
xx
xxx
集合(set
)不支持索引或切片,需通过循环或成员测试访问元素。
字典在 Python 3.7+ 按插入顺序保留元素,但在算法与概念上仍视为“无序集合”。
try
必须与 except
、finally
至少其一配合使用。
xxx
class A:count = 0 # 类属性@staticmethoddef say_hello(): # 静态方法print("Hi")A.count # ✅ OK:通过类名访问类属性
A.say_hello() # ✅ OK:通过类名访问静态方法
类属性 / 静态方法 可直接通过类名访问
xxx
class A:def __init__(self, x):self.x = x # 实例属性def show(self): # 实例方法print(self.x)a = A(10)
a.x # ✅ 实例访问实例属性
a.show() # ✅ 实例访问实例方法
实例属性 / 实例方法 需通过实例访问
xxx
默认参数必须位于非默认参数之后
# 正确 ✅
def f(a, b=2): pass# 错误 ❌
# def f(a=2, b): pass → SyntaxError
xxx
with open("file.txt", "r") as f:data = f.read()
# 这里 f 文件对象已自动关闭,无需 f.close()
with 会自动管理资源,确保即使异常发生也能关闭文件。
xxxx
私有属性/方法:通过 __name
触发名称重整
class MyClass:def __init__(self):self.__hidden = 42 # 私有属性(触发 name mangling)def __private_method(self): # 私有方法print("secret")obj = MyClass()# 不能直接访问:
# obj.__hidden → AttributeError ❌# 实际被重命名为:
obj._MyClass__hidden # ✅ OK
obj._MyClass__private_method() # ✅ OK
xxx
装饰器:修改或增强函数功能
@decorator
只是语法糖(sugar)
def wrap(x):def new_action():print("Before")x()print("After")return new_actiondef action():print("Original")aaa = wrap(action)print("Calling action():")
action()print("Calling aaa():")
aaa()
如果aaa = wrap(action)
那么就意味着:
原始的 action() 还是原来的函数(没有变)
新的包装后的函数 绑定给了 aaa()
如果你写成 action = wrap(action)
,就会改变原函数 action
所指向的内容。
xxx
__init__
是构造函数(Constructor)
-
在类中定义
__init__
方法,是 Python 创建对象时自动调用的初始化方法。 -
方法名前后的 双下划线
__
是 Python 的“魔术方法”约定(也叫特殊方法)。 -
__init__
是必须的方法 如果你想给对象初始化参数,但不是所有类都必须写它。
self
是实例自身的引用
-
self
是类中实例方法的第一个参数,代表当前对象自己。 -
不叫
self
也行(只要是第一个参数),但 Python 社区统一规范用self
,便于阅读。
class Person:def __init__(self, name, age):self.name = nameself.age = age@classmethoddef from_string(cls, info_str):name, age = info_str.split("-")return cls(name, int(age))p = Person.from_string("Alice-30")
pass # 占位语句,代码还没写,但语法上需要写点东西
Python已经事实上成为3D软件编辑器的通用脚本语言_哔哩哔哩_bilibili
09循环方式_哔哩哔哩_bilibili
默认会加上的后缀,如果存在多个同名的物体,Blender自己加
对齐物体
Blender用python编写具体的功能直接实现
bpy.ops.object.align是找到Blender里面的这个功能,然后后面的模式全部设置
一个类写一个功能,所以要配上这里的注册register
bpy.utils.register_class
但即使如此,这里设置的命令会随着Blender的关闭而重置消失
通过把脚本编写成插件,插件每次开启的时候都会自动的配上,就不需要每次打开都需要执行一遍脚本了
如何写一个Blender插件?这里会给模版
if __name__ == "__main__":
register()
的意思是:
✅ 如果是直接运行这个 Python 文件,就执行 register() 函数(比如用于注册插件)
❌ 如果是通过 import xxx 被其他模块导入,则不会执行 register()(避免干扰导入者)
(在 Unity 中实现思路):
-
Shader 实现 核心流动感:使用
UV distortion
+Fresnel
+Noise
-
LineRenderer
+ 贝塞尔路径 模拟“流麻”脉络 -
TrailRenderer
做“能量流动尾迹” -
可结合
Shader Graph
+Visual Effect Graph
+Timeline
动态联动
第一阶段目标:
URP 中实现彩色拖尾轨迹的基础效果。你将在几分钟内看到第一个有生命力的“尾迹动态”,为后续所有“胎海流麻”效果打下基础
当前唯一需要调整的点:渲染管线必须切换为 URP
原因如下:
比项 | Built-in RP | ✅ URP |
---|---|---|
Shader Graph 支持 | ❌ 不支持 | ✅ 原生支持 |
VFX Graph 支持 | 部分需扩展包 | ✅ 完整支持(配合 Shader Graph) |
自定义水面 + 深度融合 | 较繁琐 | ✅ 自带 Depth Texture 支持,易于实现软混合 |
渲染效率 | 传统 | ✅ SRP 架构、性能更现代化 |
拓展 Shader/VFX 成品兼容性 | ❌ 各种资料需重改 | ✅ 绝大多数高质量资源基于 URP/HDRP |
下一步:你创建完 URP 项目后,我会帮你搭建:
-
✅ 最小运行的轨迹拖尾 Demo 场景
-
✅ 支持颜色渐变与生命周期控制的 Trail Shader(Shader Graph)
-
✅ 可拓展到软融合/扰动的基础结构
给 Player 添加 Trail Renderer 组件
-
选中
Player
→Add Component
→ 搜索Trail Renderer
-
修改 Trail 参数如下:
参数 | 推荐设置 | 说明 |
---|---|---|
Time | 2 | 拖尾持续时间 |
Min Vertex Distance | 0.05 | 拖尾平滑程度,越小越精细 |
Start Width | 0.4 | 起始宽度 |
End Width | 0.0 | 收尾收细 |
Color Gradient | 自定义颜色渐变,如 彩虹色、蓝→青→白 | |
Material | 新建一个 URP Shader Graph 材质(下一步会教你做) |
节点结构:
输入 | 说明 |
---|---|
Vertex Color | 直接用于控制颜色与透明度 |
_TintColor (Color, HDR, 可调) | 外部叠色 |
左侧 Blackboard 中添加以下属性:
-
_TintColor
-
类型:Color
-
Mode:HDR
-
可勾选 “Exposed” 供外部材质访问
-
使用 HDR _TintColor
是为了拖尾能在视觉上「发光发热」,这是构建“胎海流麻”感、魔幻气场、能量拖尾的基础。
添加节点
拖拽出以下节点并连接:
节点类型 | 用途 |
---|---|
Vertex Color | 获取 Trail Renderer 的 per-vertex 颜色(包含透明度) |
_TintColor | 自定义外部颜色/叠色,用于统一调节整体风格 |
Multiply | 相乘:VertexColor.rgb * _TintColor.rgb |
Split(分离 RGBA) | 若你想单独处理 alpha,可拆出 VertexColor.a |
Multiply (Alpha) | VertexColor.a * _TintColor.a |
Combine | 重新组合 RGB 和 Alpha 输出为最终颜色 |
Base Color | Fragment 输出连接 Base Color 槽 |
Graph 设置调整
点击空白区域或右上角 Graph Inspector:
-
Surface Type:Transparent ✅
-
Alpha Clipping:关闭 ❌
-
ZWrite:关闭(确保透明度层叠)
-
Blend:Alpha(默认即可)
-
Two Sided:打开 ✅(如果 Trail 有旋转等效果,双面可见)
在Shader Graph 中,创建节点的快捷键是 空格键 (Spacebar)。按下空格键后,会弹出一个节点搜索窗口,方便快速找到并创建所需节点。
Create → Material → Trail_Mat
指定 Shader 为刚才创建的 SG_TrailColor
指定 _TintColor 为 白色 或淡色调
将该材质拖入 Player 的 Trail Renderer 的 Material 位置
添加移动逻辑(简易测试)
给 Player 添加这个移动脚本(挂在同一 GameObject 上):
using UnityEngine;public class PlayerMover : MonoBehaviour
{public float speed = 5f;void Update(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");Vector3 move = new Vector3(h, 0, v).normalized;transform.Translate(move * speed * Time.deltaTime, Space.World);}
}
检查
第二阶段目标:
给尾迹添加水感扰动(如波纹/流动),并与水面自然融合
渲染策略 | 实现目的 | 技术核心 |
---|---|---|
基于深度的透明度调整 | 让尾迹在靠近水面时显现,离开时淡出 | SceneDepth - PixelDepth 控制透明度 |
软边混合(Soft Blend) | 让边缘与水面过渡柔和,避免“剪影”感 | 使用 Alpha * smoothstep(...) |
扰动背景法线 | 让尾迹拖曳时“压出水痕”的感觉 | 用 FlowMap 或扰动法线输入到 Normal |
颜色调制 | 让尾迹颜色受水面或背景影响 | 可采样背景颜色、或者乘以偏蓝/偏水的调色 |
UV 或 FlowMap 流动 | 表现“尾迹在水面上扩散流动” | 用 time 或 flow_uv 滚动贴图 |
你甚至可以采样水面当前法线,把它们混合进去,制造“共振”效果,比如:
finalNormal = normalize(lerp(baseNormal, waterSurfaceNormal, 0.5));
用一个扰动贴图(Noise / FlowMap)生成法线扰动,输入到 Shader 的Normal
插槽中,让光照对该扰动作出反应。
Time → Multiply Flow Speed
↓
Add to UV (可选:FlowMap 采样 → 解码方向 → 加入 UV)
↓
Sample MainTex or MaskTex
↓
→ 接入 Albedo / Alpha 等通道
🧠 为什么这样看起来“在动”?
因为纹理本身不动,你修改的是 纹理坐标(UV)的位置随时间变化,就产生了 视觉上的流动感。
打开你的 Shader Graph(SG_TrailColor)
-
添加属性:
-
_FlowSpeed
(Float, 默认 1) -
_MainTex
(2D Texture,默认白图) -
_DistortStrength
(Float, 默认 0.05)
-
-
添加核心节点结构:
UV 扰动主线:
Time → Multiply (_FlowSpeed) → Add to UV → Sample Texture (_MainTex) → Multiply RGB with VertexColor.rgb → BaseColor
Soft Blend Alpha 主线:
Sample _MainTex (R通道) → One Minus → Power(3~5) → Multiply VertexColor.a → Alpha
----腰斩,做不了,需求太模糊了,还得学