沒有所謂的毅力_ 发表于 2022-2-23 23:33:29

有个代码看不懂,求解读

def uuid_generator():
    uuid_pattern = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
    uuid = ""
    now_t = int(round(time.time() * 1000000)) / 1000.0
    print(len(uuid_pattern))
    for i in uuid_pattern:
      e = (int(now_t + 16 * random.random()) % 16) | 0
      now_t = math.floor(now_t / 16)
      if i != "-":
            uuid = uuid + hex(e if i == "x" else 3 & e | 8)[-1:]
      else:
            uuid = uuid + "-"
    # print(uuid)
    return uuid

这是一个生成uuid的函数,然后里面有一个hex(e if i=="x" else 3 & I 8)[-1:]
完全看不懂是啥意思 &和I 知道是and 和or 但是这样写的混在一起就看不懂了 [-1:]是切片大概看明白了,但是结果也不是特别清楚
求教说,如果正常写一个if的话写出来是什么样子的 方便解读和理解,另外为什么要这样写呢?是简写的目的吗?初学者看起来真的很吃力

isdkz 发表于 2022-2-23 23:47:20

本帖最后由 isdkz 于 2022-2-23 23:52 编辑

一:
结果1 if 条件 else 结果二是一个三元表达式,如果满足条件,表达式的值就是结果一,否则就是结果二。
你的代码中的 uuid = uuid + hex(e if i == "x" else 3 & e | 8)[-1:] 写成 if 语句就是:
if i == "x":
    uuid = uuid + hex(e)[-1:]
else:
    uuid = uuid + hex(3 & e | 8)[-1:]

二、[-1:] 是切片,指的是从倒数第一个元素到序列末尾,
但是因为你这里的序列是字符串(hex()的返回值是一个字符串),所以你使用 [-1:] 和 [-1] 并没有区别

在python shell中给你演示一下:>>> a = 'test'
>>> a[-1:]      # 如果是字符串,[-1:] 和 [-1] 没有区别
't'
>>> a[-1]
't'
>>> b = ['t', 'e', 's', 't']   
>>> b[-1:]   # 如果是列表,[-1:] 会得到最后一个元素组成的列表, [-1] 会得到最后一个元素
['t']
>>> b[-1]
't'
>>>

沒有所謂的毅力_ 发表于 2022-2-24 12:42:55

isdkz 发表于 2022-2-23 23:47
一:
结果1 if 条件 else 结果二是一个三元表达式,如果满足条件,表达式的值就是结果一,否则就是结果 ...

3 & e | 8
这个我看半天没有懂
假设e = 1
输出的结果为什么是9,不应该是8吗

isdkz 发表于 2022-2-24 12:51:45

沒有所謂的毅力_ 发表于 2022-2-24 12:42
3 & e | 8
这个我看半天没有懂
假设e = 1


不明白你为什么说是 8,

& 和 | 是位运算,

& 只要有一个为 0 结果就是 0,否则结果就是 1,

| 只要有一个为 1 结果就是 1,否则结果就是 0,

数值在计算机里面都是以 二进制的形式存在的,位运算就是对数值的每一个位进行 与或非 等运算,

假设 e = 1,3 & e | 8 即 3 & 1 | 8,假设整数占了8个位(多少位都无所谓,多出来的部分都是 0)
运算过程:
    3:00000011
& 1:00000001
-----------------------
         00000001   
| 8:00001000
---------------------------
         00001001      十进制为 9
页: [1]
查看完整版本: 有个代码看不懂,求解读