Python学习

下面用列表的形式,来记录一些适合我本人的Python的笔记。内容主要来自于Python的官方文档,以及Codex询问。由于不同的人具有不同的编程基础和世界观,所以本文仅适用于此时此刻的博主。欢迎在评论区留言讨论。

注意事项:

  • 不可以在列表的开头使用格式化代码;

Python基本逻辑

  1. 可以在命令行中,直接输入「python」来启动一个命令行中的python程序,直接在命令行中进行一些基本的计算;
  2. python的一个特点是「动态变量」,即给对象赋值的之前,不必提前指定对象的类型。比如
1
2
s=41
s='Hello world!'
  1. 在python中,字符串(string)可以用单引号「’abc’」或双引号「“abc”」来包裹。特别地,如果希望输入引号,可以用反斜线进行转义。
  2. 字符串s='abc\n123',则在命令行中输入s的输出结果是'abc\n123'。在命令行中输入print(s)的结果则是
1
2
3
>>>print(s)
abc
123

即特殊字符在print函数中才会改写。如果不希望被字符串在print的时候被转写,可以使用print(r'123\n')
5. 可以对字符串进行如下操作

  • 重复*:3 * 'abc'='abcabcabc'
  • 合并+:'abc'+'def'='abcdef'
  1. 对于字面值,可以不加+号来粘合;
  2. 不可以对变量或表达式来省略+号粘合;
  3. 字符串可以用方括号索引,排序从0开始,即word[5]表示取第6个字符。索引还支持负数,含义是「倒数第几个」,比如word[-1]表示倒数第1个字符,负数索引从-1开始。
  4. 切片索引:word[:5]表示从头取到第6个字符,但第6个不取;word[-2:]表示从倒数第2个开始取,且包含倒数第2个。总之是一个左闭右开区间,不写就是正负无穷。
  5. 切片会自动处理越界索引;
  6. 长度函数返回列表长度: len()
  7. 列表支持合并和重复,另外列表是「mutable可变类型」,而字符串是「不可变类型」,即列表支持修改某个元素,比如
1
2
3
4
>>> s=[1,2,3]
>>> s[2]=5
>>> s
[1, 2, 5]
  1. 函数 list.append 可以在列表后增加元素;
  2. 列表的赋值不会复制对象,而是创建一个指向这个对象的指针。当你修改原对象的时候,新对象也会随之改变。如果要复制,需要用list.copy函数,进行「浅拷贝」。实质上,浅拷贝是一个这样的过程
    • a=[指针1,指针2]
    • b=[指针3,指针4]
    • 其中指针1和指针3的指向相同,指针2和指针4的指向相同;
    • 如果赋值b[0]=[3,4,5],则改变了b[0]这个指针的指向,后续b[0].append(6)不会改变print(a[0])的输出结果;
    • 如果进行b[0].append(3),则先找到了指针1所指的对象,然后为这个对象添加了新元素3,这样一来,print(a[0])的值也发生了变化。
  3. 当然,不是所有类型都有append方法。对于不可变类型(比如str, int),进行合并操作实际上是改变了指针所指的地址,并不是改变了当前地址的值;
  4. 元组是用小括号括起来的,它不可以被修改。
  5. 集合是用大括号括起来的,它会在定义的时候自动删除重复的元素;
  6. 用大括号括起来后,形如{key:value}的称为字典。字典中的key可以是不可变类型,比如字符串、元组或数值;
    • 可以通过dict.keys()来获取字典中的所有key;
    • 可以用dict.values()
    • 可以用dict.items()来获取键值对元组构成的列表;
  7. 空字典是{},空集合是set()
  8. 命令del dict(key)可以定向删除dict里key这个键;
  9. 命令dict.clear()会把dict变成空字典;
  10. 还有函数参数也不会,函数参数在传入的时候,本质上是创建了一个局部的指针,这个指针
1
2
3
4
5
6
7
8
9
def f(lst):
lst.append(4) # 穿越引用去改对象 —— 外面能看到

def g(lst):
lst = [9, 9] # 只是让局部变量指向新对象 —— 外面看不到

a = [1, 2]
f(a); print(a) # [1, 2, 4]
g(a); print(a) # [1, 2, 4] 没变!
  1. 如果想要在函数体内,修改全局变量的值,则需要在函数体内声明global a

  1. 多重赋值:a,b=0,1
  2. while循环:用缩进来组织循环体
1
2
3
4
while a<10:
print(a)
a,b = b,a+b
print('这部分内容在循环体之外')
  1. print函数可以输出给定参数的值,print('the value of i is',i),在打印时会自动给参数i前面添加空格。实际操作如下:
1
2
3
4
>>> i = 256*256
>>> j= 16*16
>>> print('the value of i is ',i,'and the value of j is',j)
the value of i is 65536 and the value of j is 256
  1. 关键字参数 end 可以取消输出后面的换行, 使得你可以在这个字符串后面继续编辑,或用另一个字符串结尾.
1
2
3
4
5
6
>>> a, b = 0, 1
... while a < 1000:
... print(a, end=',')
... a, b = b, a+b
...
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,>>>
  1. 字段 elif 是python中的else if;
  2. 对于一个字典users,假设Hans是其中的一个key,则 pop('Hans') 可以删掉旧键并返回它的值;
  3. 字段 range(2,n) 取的是 [2, 3, 4, ... , n-1],依旧左闭右开。
  4. 在 for 循环中,else 子句会在循环结束其最后一次迭代之后,即未执行 break 的情况下被执行;
  5. 在 while 循环中,else 子句会在循环条件变为false之后执行;
  6. pass语句
    • 不执行任何操作;
    • pass可以作为占位符,当你需要实现一个东西,但是暂时还没思路的时候,可以先pass掉,注释上,后面再来写;
  7. match-case语句:多值选择,
    • 注意缩进,最后使用_作为通配符必定成功
    • 可以用|组合多个字面值
    1
    2
    3
    4
    5
    6
    7
    match status: 
    case 400:
    return "Bad request"
    case 411:
    return "Hahaha"
    case _:
    return "I don\'t know what is wrong"
  8. 调用函数时,可以使用「关键字参数」来给变量赋值。关键字参数的赋值需要符合以下规则:
    1. 关键字参数的顺序无关紧要;
    2. 在混合使用赋值方法的时候,必须先给位置参数赋值;
    3. 不可以对同一个参数赋值两次;
  9. 在定义函数的时候,func(para1,*arguments,**keywords),argument可以起到一个接受多余参数的作用,keywords可以将**多余的关键字参数赋值(也就是带等号的那些)**信息把打包成一个字典。比如
    • 代码 func(123, 'arg1', 'arg2', 'arg3', key1='abc',key2='def') 就会传入
    • para==123
    • argument={‘arg1’,’arg2’,’arg3’}是一个集合;
    • keywords={key1=’abc’,key2=’def’}是一个字典
  10. 可以限制传递参数的方式,格式如下
    1
    def func(para1, para2, /, para3, *, para4, para5)
    • 其中para1, para2仅位置;
    • para3位置或关键词都可以;
    • para4和para5仅关键词。
  11. 未完待续

Flet控件专栏

以下内容是用Flet开发图形化界面的一些注记。尽管以前上过Android平台Java开发,但是很多内容已经不记得了,格式化的东西还是需要多操作。

  1. 首先需要pip安装flet包:pip install flet
  2. 可以认为,flet的基本单位是控件(control),我们总是对控件进行添加、点击事件、排列;
  3. 对于一个控件e,在我们操作之后,可以对其进行更新e.update()

Text

  1. value:文本显示的内容。
  2. on_tap:鼠标点击事件。
    • 定义on_tap函数的时候,其中的参数e就代表了这个控件对象,我们可以用e.control.value来访问这个控件的value变量
    1
    2
    def on_tap(e):
    e.control.value = 'Mio'
    • 需要将selectable调整成True才可以使用on_tap事件
  3. size:显示文本的大小,单位px。
  4. weight:文本的粗细。
    • ft.FontWeight.NORMAL表示正常粗细
  5. width:宽度
  6. italic:bool值,是否斜体。
  7. bgcolor:背景颜色
    • 使用形如ft.Colors.BLUE的作为值
  8. max_lines:最大行数
  9. selectable:是否可选择
    • 默认不可被选择
  10. text_align:文本对齐方式
    • 值形如text.TextAlign.STARTtext.TextAlign.ENDtext.TextAlign.CENTER

TextField

  1. label:输入框左上角部分显示的提示文字。
  2. value:文本框中的内容/默认值;
  3. hint_text:提示词
  4. on_change:内容改变时调用
  5. on_focus:获得焦点时调用
  6. on_blur:失去焦点时调用
  7. on_submit:提交/按回车键时调用
  8. width, height
    • height是文本框占用的最大高度,不代表当前方框高度。但文本框会预先占用掉height这么高的位置
  9. auto_focus:是否自动获得焦点
    • 进入页面时,若页面内有多个文本输入框,有True的那一个自动获得焦点
  10. disabled:是否可编辑
  11. password:bool值,是否是密码类型
  12. can_reveal_password:是否可揭露密码(显示揭露密码按钮)
  13. max_length:可输入的最大字符数
  14. max_line或min_lines:最大/小支持行数
    • min_lines如果是2,而只有1行,那么文本框的输入框初始就会保留2行的高度
  15. multiline:是否支持多行
  16. shift_enter:是否用shift+enter来换行

Container容器

  1. content;容器内部的控件
  2. border:边框属性
    • 设置ft.Border.all(2,ft.Colors.RED)会给这个容器的「所有」边缘加上「2px」粗的「红色」边框。
  3. padding:容器边框与其内部组件的距离,单位px;
  4. alignment:对齐方式,
    • 左上ft.Alignment.TOP_LEFT
    • 左中ft.Alignment.CENTER_LEFT
    • 右下ft.Alignment.BOTTOM_RIGHT
  5. spacing:容器中,内部组件之间的距离

Column容器

  1. controls:列表,将该列表的控件从上到下罗列出来。
  2. expand:bool值,是否将该容器的下边缘,扩充到整个父容器中。