鱼C论坛

 找回密码
 立即注册
查看: 1050|回复: 3

[已解决]有个代码看不懂,求解读

[复制链接]
发表于 2022-2-23 23:33:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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的话写出来是什么样子的 方便解读和理解,另外为什么要这样写呢?是简写的目的吗?初学者看起来真的很吃力
最佳答案
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'
>>>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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'
>>>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-24 12:42:55 | 显示全部楼层
isdkz 发表于 2022-2-23 23:47
一:
结果1 if 条件 else 结果二  是一个三元表达式,如果满足条件,表达式的值就是结果一,否则就是结果 ...

3 & e | 8
这个我看半天没有懂
假设e = 1
输出的结果为什么是9,不应该是8吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表