0%

Chapter

Goroutines and Channels

Goroutines

  1. 第一个gorountinemain

  2. 使用go关键字,例子如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package main

    import (
    "fmt"
    "time"
    )

    func main() {
    go spinner(100 * time.Millisecond)
    const n = 45
    fibN := fib(n)
    fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
    }

    func spinner(delay time.Duration) {
    for {
    for _, r := range `-\|/` {
    fmt.Printf("\r%c", r)
    time.Sleep(delay)
    }
    }
    }
    func fib(x int) int {
    if x < 2 {
    return x
    }
    return fib(x-1) + fib(x-2)
    }
  3. 除了退出之外没有其他办法使得一个gorountine停止另外一个,当然,依然可以通过gorountine之间的交流来请求对方停止

阅读全文 »

终于考完了,开始更新啦!

Chapter 4

Iterators and Generators
这一章的内容个人其实很少用到,但是又感觉还是比较重要,所以可能记录的点比较多,甚至于全部记录

  1. 手动消费一个迭代器(iterator)
    使用next(iterator[, default])函数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with open('/etc/passwd') as f:
    try:
    while True:
    line = next(f)
    print(line, end='')
    except StopIteration:
    pass
    ## 或者
    with open('/etc/passwd') as f:
    while True:
    line = next(f, None)
    if line is None:
    break
    print(line, end='')
    也即,当传入第二个参数的时候,将会返回第二个参数作为默认值,而不是抛出StopIteration异常
阅读全文 »

Chapter 3

Numbers, Dates, and Times

  1. 舍入小数到某一指定小数点

    1
    2
    round(1.23, 1) # 1.2
    round(1.27, 1) # 1.3

    采用四舍五入,如果第二个参数为负数,那么就会指示十位百位,,,以此类错

    1
    round(1627731, -1) # 1627730
  2. 进行准确的十进制计算

    1
    2
    3
    4
    5
    # Python, js等语言均有类似的问题
    a = 4.2
    b = 2.1
    a + b # 6.300000000000001
    (a + b) == 6.3 # False

    想要避免这种问题,使用Decimal

    1
    2
    3
    4
    5
    6
    from decimal import Decimal
    a = Decimal('4.2')
    b = Decimal('2.1')
    a + b # Deciaml('6.3')
    (a + b) == Decimal('6.3') # True
    (a + b) == 6.3 # False
阅读全文 »

Chapter 2

Strings and Text

  1. 在正则表达式中使用括号来捕捉目标内容
    1
    2
    3
    4
    5
    6
    7
    datepat = re.complie(r'(\d+)/(\d+)/(\d+)')
    m = datepat.match('11/27/2012')
    m.group(0) # 11/27/2012
    m.group(1) # 11
    m.group(2) # 27
    m.group(3) # 2012
    m.groups() # ('11', '27', '2012')

    注意在正则表达式中常常需要使用raw字符串,即在字符串前加上r,表示其中的内容不应该进行转义,否则上述的正则表达式必须写为'(\\d+)/(\\d+)/(\\d+)'这个地方可能会产生如下疑问如果不进行转义的话,那怎么识别\n这种换行符号呢,可以这样理解,regex和python原生的字符串使用的是两套系统,在使用raw字符串的时候,可以认为python的系统完全被屏蔽,字符串中的内容会被传入regex系统,并将其中的字符进行regex系统的转义,如\d代表一个数字,\s代表一个连续字符串,等等.其中\n不仅在Python系统中是转义字符,在regex系统中也是转义字符,所以使用raw regex的时候,字符串中的\n确实会被理解为两个字符,而不是换行符,但是在传入regex进行处理的时候,会被再一次转义,处理为换行符. 通过实验也可以发现

    1
    2
    3
    re.match('\n', '\n')
    re.match('\\n', '\n')
    re.match(r'\n', '\n')

    均可以正常匹配
    参见What exactly is a “raw string regex” and how can you use it?

阅读全文 »

前言

本书介绍了Python应用在各个领域中的一些使用技巧和方法,从最基本的字符、文件序列、字典和排序,到进阶的面向对象编程、数据库和数据持久化、 XML处理和Web编程,再到比较高级和抽象的描述符、装饰器、元类、迭代器和生成器,均有涉及。书中还介绍了一些第三方包和库的使用,包括 Twisted、GIL、PyWin32等。本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案。书中的代码和方法具有很强的实用性,可以方便地应用到实际的项目中,并产生立竿见影的效果。尤为难得的是,本书的各位作者都具有丰富的业界实践经验,因此,本书不仅给出了对各种问题的解决方案,同时还体现了很多专家的思维方式和良好的编程习惯,与具体的细节性知识相比,这部分内容无疑是本书的精华。

很久之前看过一部分,基本上都忘记了,现在又重拾这本书,打算把平时经常用到的几章先看完(其实就是不想做课内的各种实验:(),主要记录一些我不知道,或者我知道,但是依然觉得比较重要的点(指csp)。一些本人平时已经用的很多,或者觉得未来用到的几率很小的点将不会记录。由于部分使用了书中的示例代码,如有侵权,请联系删除

Chapter 1

Data Structures and Algorithms

  1. 解包操作可以嵌套,使用_来丢弃不需要的值
    1
    2
    3
    data = ['ACME', 50, 91.1, (2012, 12,21)]
    name, shares, price, (year, mon, day) = data
    _, shares, price, _ = data
  2. 不定长度的解包,通过*表达式来解决
    1
    2
    record = ('Dave', 'dave@example.com', '123', '456')
    name, email, *phone_numbers = user_record
    使用单独的*或者*_来丢弃不需要的值
    1
    2
    record =  ['ACME', 50, 91.1, (2012, 12, 21)]
    name, *+, (year, *_) = record
  3. 使用deque(maxlen=N)来创建一个只有固定长度的队列,当加入新的成员而队列已满的时候将会自动将最早加入的成员推出。虽然也可以自己通过一些逻辑来实现,但是这种方法不但简洁而且更快
阅读全文 »

Chapter 7

interfaces

Interfaces as Contracts

Interface Types

  1. io包中的一些interface
    1
    2
    3
    4
    5
    6
    7
    package io
    type Reader interface {
    Read(p []byte) (n int, err error)
    }
    type Closer interface {
    Close() error
    }
  2. 与结构体一样,interface也可以进行embedding操作,从而简化
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type ReadWriter interface {
    Reader
    Writer
    }
    type ReadWriteCloser interface {
    Reader
    Writer
    Closer
    }
    但与struct不同的是,进行embedding操作的顺序没有关系,Reader在前还是Writer并不会对生成的新接口有什么影响
阅读全文 »

原意是想要给新买的鼠标设置按键映射,将侧键映射到桌面切换(super+left/right),由于罗技官方的Logitech Option 并没有Linux版本,所以需要使用第三方软件,一开始找到了名为piper的软件可以为支持列表中的鼠标设置按键/功能映射,最终发发现我的这款鼠标无法设置宏,遂作罢。之后又发现了xdotool以及xbindkeys可以实现更加通用的按键映射,自然也包括鼠标按键,通过这种方法间接实现了宏的设置

主要参考Linux下的鼠标宏映射实现

基本信息

系统: manjaro-deepin
鼠标: Logitech M590
需要的软件:
- xdotool 通过命令进行按键模拟
- xbindkeys 将按键和命令进行绑定
- xorg-xev 获得特定按键按键码

阅读全文 »