推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
css3
V2EX  ›  Python

一个函数,一个变量,整懵逼了

  •  
  •   css3 · Dec 5, 2019 · 16602 views
    This topic created in 2534 days ago, the information mentioned may be changed or developed.
    • 为什么在 b变量里边 my_time()不再被调用了??
    • 直接打印 print("a"+my_time())时,my_time()每次都会被调用
    • 我要在 b 变量中时时更新 my_time()应该怎么做?
    • 变量是什么😂,什么时候变,什么时候不变?
    >>> import time
    >>> def my_time():
    ... 	return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    >>>
    >>> my_time()
    '2019-12-05 11:29:47'
    >>> my_time()
    '2019-12-05 11:29:50'
    >>> b = "a"+my_time()
    >>> b
    'a2019-12-05 11:30:32'
    >>> b
    'a2019-12-05 11:30:32'
    >>> b
    'a2019-12-05 11:30:32'
    
    
    >>> print("a"+my_time())
    a2019-12-05 11:38:02
    >>> print("a"+my_time())
    a2019-12-05 11:38:03
    >>> print("a"+my_time())
    a2019-12-05 11:38:05
    
    
    
    >>> b = "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    >>> b
    'a2019-12-05 11:39:27'
    >>> b
    'a2019-12-05 11:39:27'
    >>> b
    'a2019-12-05 11:39:27'
    >>> 
    
    
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:41:58'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:41:59'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:00'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:00'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:01'
    >>> "a" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    'a2019-12-05 11:42:02'
    >>> 
    
    Supplement 1  ·  Dec 6, 2019

    让v站大佬见笑了

    那为什么在编辑器里边b每次都是被调用的?

    kn6yVt.png

    116 replies  •  2019-12-07 00:46:36 +08:00
    1  2  
    ❮ ❯
    j0hnj
    j0hnj
    Dec 5, 2019❤️54
    1
    唉,要不还是转行吧
    Caballarii
    Caballarii
    Dec 5, 2019❤️1
    2
    b 变量是"a"+my_time()执行的结果,类型是字符串,字符串凭什么变,
    b 写成函数每次调用才会每次执行
    io123
    io123
    Dec 5, 2019 via Android
    3
    唉,要不还是转行吧
    jimliang
    jimliang
    Dec 5, 2019
    4
    唉,要不还是转行吧
    1nakaELYBbsXbZxY
    1nakaELYBbsXbZxY
    Dec 5, 2019
    5
    变量在赋值的时候变化。
    1nakaELYBbsXbZxY
    1nakaELYBbsXbZxY
    Dec 5, 2019
    6
    唉,要不还是转行吧
    xem
    xem
    Dec 5, 2019
    7
    唉,要不还是转行吧
    U7Q5tLAex2FI0o0g
    U7Q5tLAex2FI0o0g
    Dec 5, 2019
    8
    唉,要不还是转行吧
    css3
    css3
    OP
    Dec 5, 2019
    9
    @css3 @j0hnj @Caballarii @io123 @jimliang @mmixxia @xem @littleylv
    准备转了,各位不要再说了
    JeffGe
    JeffGe
    Dec 5, 2019 via Android
    10
    唉,要不还是转行吧
    b821025551b
    b821025551b
    Dec 5, 2019
    11
    b 是你函数执行的结果,如果你想要它“变”,需要把 b 赋值成闭包;
    初学者的话出这种疑问很正常,但是看你的回复又不像初学者,那么转行吧:doge:
    dswyzx
    dswyzx
    Dec 5, 2019
    12
    python 就是捉急.别学了
    面向对象语言 强类型.
    断点调试看变量 啥都给你整明白了
    JCZ2MkKb5S8ZX9pq
    JCZ2MkKb5S8ZX9pq
    Dec 5, 2019
    13
    唉,教程从头再看一遍吧。
    my_time 是函数
    my_time() 是它返回的结果 是字符串
    你的 b 一开始就字符串 a+字符串函数返回的结果

    要跟着变你可以把那个 a+写到 return 里

    不过还是建议从头看教程吧
    Trim21
    Trim21
    Dec 5, 2019 via Android
    14
    你这想要的是 class 的 property 啊
    ddzzhen
    ddzzhen
    Dec 5, 2019 via Android
    15
    大佬请不要对新手这么残忍,楼主肯定是初学者,我上班也基本不用 python,准确的说不用代码,当初学的时候有很多这种类似的问题,现在写量化脚本也不用类,不是每个 python 人都用 python 养活自己,毕竟门槛太低了
    sheep3
    sheep3
    Dec 5, 2019
    16
    不是,你转行之前干啥的

    这不是基础到极点的东西么......
    xiaofan305
    xiaofan305
    Dec 5, 2019 via Android
    17
    唉,要不还是转行吧
    wuwukai007
    wuwukai007
    Dec 5, 2019 via Android❤️1
    18
    python 是简单,那是针对有其它语言经验的人,建议不要走马观花,静下心来,从头学起
    eftpos
    eftpos
    Dec 5, 2019❤️12
    19
    不知道楼上劝转行的人是什么资质。面对初学者的心态难道不是包容和引导吗?
    在这个帖子 /t/625470 里看到了大家对心胸狭隘的抨击,那复读灌水劝退内容算不算心胸狭隘呢?
    回帖前请注意右下角的“请尽量让自己的回复能够对别人有帮助”以及阅读 /about
    MeteorCat
    MeteorCat
    Dec 5, 2019 via Android
    20
    唉,要不还是转行吧
    levelworm
    levelworm
    Dec 5, 2019❤️1
    21
    b 是个字符串,所以你每次打 b 无非就是出来字符串里头的内容。严格地说是 b 这个 name 指示的地址里头的内容。你可以再次给 b 赋值,就会变化了。但是这时候其实是指向另外一个地址。

    ```
    >>>b
    'a2019-12-04 23:20:53'
    >>>hex(id(b))
    '0x2126325b580'
    >>>b = "a" + my_time()
    >>>b
    'a2019-12-04 23:21:15'
    >>>hex(id(b))
    '0x2126325b850'
    ```
    yupnano
    yupnano
    Dec 5, 2019
    22
    唉,要不还是转行吧
    superrichman
    superrichman
    Dec 5, 2019 via iPhone
    23
    python 可以通过
    print(type(b))
    来看变量 b 的数据类型。应该会看到类似 class str 的输出,说明 b 的值是个字符串 string,而字符串在定义了之后是不会改变的。要“修改”字符串 只能新建另一个再赋值给 b。
    hoyixi
    hoyixi
    Dec 5, 2019❤️1
    24
    my_time: 小 b,你好,我是印钞机,只是把印好的一张 100 块给你了,并没有把我自己给你
    mckelvin
    mckelvin
    Dec 5, 2019 via Android
    25
    () 长的像硬币不?得投一次币才给干一次活。
    ThomasZ
    ThomasZ
    Dec 5, 2019 via Android
    26
    跨行学 Python ?不要上手就开搞,先看看基础理论再说
    wangyzj
    wangyzj
    Dec 5, 2019
    27
    唉,要不还是转行吧
    ClarkAbe
    ClarkAbe
    Dec 5, 2019 via Android
    28
    唉,要不还是转行吧,秋梨膏
    leido
    leido
    Dec 5, 2019
    29
    xswl, 哈哈哈哈
    RV0n
    RV0n
    Dec 5, 2019
    30
    唉,要不还是转行吧
    kasper4649
    kasper4649
    Dec 5, 2019 via Android
    31
    建议还是从基础学吧,搞懂字符串再说
    wizardoz
    wizardoz
    Dec 5, 2019
    32
    你是不是看了抖音决定学 Python 的?
    shfanzie
    shfanzie
    Dec 5, 2019
    33
    唉,要不还是转行吧
    gz911122
    gz911122
    Dec 5, 2019
    34
    唉,要不还是转行吧
    ZRS
    ZRS
    Dec 5, 2019
    35
    建议从 C 开始 先把 C 的基础语法整明白了 写几个算法题 再开始 Python
    hanyceZ
    hanyceZ
    Dec 5, 2019
    36
    唉,要不还是转行吧
    CrazyRain0001
    CrazyRain0001
    Dec 5, 2019
    37
    火钳刘明
    misaka19000
    misaka19000
    Dec 5, 2019❤️3
    38
    函数式对行为的一种抽象,变量代表了一个状态

    PS: 楼上的队形党太拉低 V 站水平了
    ljpCN
    ljpCN
    Dec 5, 2019❤️3
    39
    楼主很适合学习函数式编程
    wutiantong
    wutiantong
    Dec 5, 2019❤️3
    40
    这就劝人转行?

    lazy evaluation 了解一下?

    楼主的思维方式很有意义。

    劝某些人不要太僵化。
    raistlin916
    raistlin916
    Dec 5, 2019❤️1
    41
    问题出在中文歧义上,字面上看,『变量』其实是可变量,执行函数是『变某量』,所以容易混淆。
    MinQ
    MinQ
    Dec 5, 2019
    42
    唉,要不还是转行吧
    Yooloo
    Yooloo
    Dec 5, 2019
    43
    已学者往往理解不了初学者为什么会提出这种问题.是个啥理论还是悖论来着,忘了.多点宽容多点爱
    simenet
    simenet
    Dec 5, 2019
    44
    唉,要不还是转行吧
    唉,要不还是转行吧
    唉,要不还是转行吧
    唉,要不还是转行吧
    cppgohan
    cppgohan
    Dec 5, 2019
    45
    楼主是要钓鱼赚波金币?
    yinjy
    yinjy
    Dec 5, 2019
    46
    为什么要嘲讽楼主,其实这个问题还是挺有意思的
    Vindroid
    Vindroid
    Dec 5, 2019
    47
    没有基本功?耐下性子从最基本的学起吧,你这样学容易走火入魔啊
    yeze322
    yeze322
    Dec 5, 2019
    48
    楼上都太欢乐了
    j0hnj
    j0hnj
    Dec 5, 2019❤️5
    49
    楼主,非常对不起,一时没忍住,嘴欠了一下,做了个坏一楼,确实太 mean 了。
    能对初学者讲明白最基础的问题,才是真正的大佬,引以为戒。
    williamszz
    williamszz
    Dec 5, 2019
    50
    唉,要不还是转行吧
    jon
    jon
    Dec 5, 2019
    51
    唉,要不还是转行吧
    hallwoodzhang
    hallwoodzhang
    Dec 5, 2019❤️2
    52
    >>> import time
    >>> def my_time():
    ... return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    ...
    >>> b = lambda : 'a' + my_time()
    >>> b
    <function <lambda> at 0x7fdc8494f840>
    >>>
    >>> b()
    'a2019-12-05 14:43:58'
    >>> b()
    'a2019-12-05 14:44:01'
    >>> b()
    'a2019-12-05 14:44:04'
    >>>
    hallwoodzhang
    hallwoodzhang
    Dec 5, 2019❤️2
    53
    我猜你想要这种效果
    azcvcza
    azcvcza
    Dec 5, 2019
    54
    不知道是钓鱼还是被钓
    Tokin
    Tokin
    Dec 5, 2019
    55
    我滴妈呀,这个不应该入门就应该懂的吗?钓鱼贴?
    Phishion
    Phishion
    Dec 5, 2019❤️1
    56
    上面列队劝人家转行的,有几个能非常深入的从底层讲解透这个问题的?当复读机能显得你们特别高明?我觉得吧,如果不会说话,可以不要说嘛,别回来往深了问一个个哑火了,挤兑别人倒有一手。
    ermao
    ermao
    Dec 5, 2019
    57
    string b = "a" + my_time();

    加上 string 你明白了吗?它把赋值那一刻的 my_time() 存了起来。所以你无论输出多少次,它都不会变呀。
    imklay
    imklay
    Dec 5, 2019
    58
    我觉得还挺可爱的。。
    crella
    crella
    Dec 5, 2019
    59
    玩玩 ruby 的 eval、instance_eval、class_eval,玩得让我头痛欲裂
    leadersnowy
    leadersnowy
    Dec 5, 2019
    60
    唉,要不还是转行吧
    crella
    crella
    Dec 5, 2019
    61
    还有提醒楼主,在绝大多数语言中,数组 a = 数组 b,这个操作是引用传递,就是当后续更改了数组 b 的某个元素的值后,数组 a 也会发生对应的变化。在你使用的语言中,一定要先查查语言的深拷贝(deepcopy 方法)
    mara1
    mara1
    Dec 5, 2019
    62
    楼主别听他们的,谁都是一点点学的,慢慢来,自己不要气馁。

    基于你初学者的身份,建议你先谷歌,或找同事问,效率更高,如果还解决不了,再去网上问。
    VShawn
    VShawn
    Dec 5, 2019
    63
    我猜测楼主是想用闭包?

    要不还是转行吧
    Nugine0
    Nugine0
    Dec 5, 2019
    64
    ```
    $ cat a.py
    import time

    def get_time():
    return time.strftime(
    '%Y-%m-%d %H:%M:%S',
    time.localtime(time.time()))

    class TimeStr(str):
    def __str__(self):
    return get_time()
    def __repr__(self):
    return get_time()

    b = TimeStr()
    for i in range(5):
    print(f"{i+1}: {b}")
    time.sleep(1)

    $ python a.py
    1: 2019-12-05 15:50:57
    2: 2019-12-05 15:50:58
    3: 2019-12-05 15:50:59
    4: 2019-12-05 15:51:00
    5: 2019-12-05 15:51:01
    $
    ```
    Ainndy
    Ainndy
    Dec 5, 2019 via iPhone
    65
    唉,要不还是转行吧
    HanShan63
    HanShan63
    Dec 5, 2019
    66
    唉,要不还是转行吧
    blackccc
    blackccc
    Dec 5, 2019
    67
    变量就是 72 变,想怎么变就怎么变
    zixiaoguan
    zixiaoguan
    Dec 5, 2019
    68
    代码是一行一行执行的,b 在赋值的时候已经执行了那段代码,以后就不会执行了。每次需要反复执行的代码,那种代码叫做函数。
    neroxps
    neroxps
    Dec 5, 2019
    69
    楼主标题写的很好,什么是变量,什么是函数,楼主搞清楚就是了。

    正如 bash

    ```bash
    time(){
    echo date
    }

    echo "a $(time)"

    # 和 echo "a $(date)" 是一个意思啊。

    ```

    函数每次调用都会执行,而变量只是存在一个内存空间的东西,变量在不被别人修改的时候是不会变化的。函数是动态的,调用就执行一次。

    函数是动词,变量是形容词。
    neroxps
    neroxps
    Dec 5, 2019
    70
    @neroxps #69 手残连 bash 都敲错

    ```bash
    time(){
    echo $(date)
    }

    echo "a $(time)"

    # 和 echo "a $(date)" 是一个意思啊。

    ```
    MickeyGate
    MickeyGate
    Dec 5, 2019❤️1
    71
    ?我开始怀疑这个论坛的专业性...
    HonoSV
    HonoSV
    Dec 5, 2019
    72
    别学 python,来学 java 吧,好懂很多
    CosimoZi
    CosimoZi
    Dec 5, 2019
    73
    楼主很适合学习函数式编程
    solgh
    solgh
    Dec 5, 2019
    74
    唉,要不还是转行吧
    madmen
    madmen
    Dec 5, 2019
    75
    是不是买了朋友圈推送的,1 天学会 python ?
    这个是计算机基础知识,先去恶补一下基础知识会比较好。
    Erroad
    Erroad
    Dec 5, 2019 via iPhone
    76
    楼主要不去玩玩人力资源机器?
    HolmLoh
    HolmLoh
    Dec 5, 2019❤️1
    77
    他们都只是调侃而已,不比挂在心上
    建议去看一些关于计算机书和 Python 的基本语法,应该会对你大有帮助

    这里主要是两个点
    一个是 my_time(),每次使用“my_time()”的时候,则会调用一次“my_time()”这个函数,而函数的每次调用都会执行一次函数对象的代码,所以每次调用就相当于生成一个新的值
    第二是 b = ,这个是定义一个遍历 b,并赋值,使用“=”赋值之后,只要变量“b”不被再次使用“=”覆盖掉原值,他的数据就不会变

    通俗的讲就是,你有一个文具袋( my_time ()),你从箱子里面拿出一支笔(调用函数),随后放到你的桌子上(赋值给 b ),随后你就可以看到桌子上的笔了(打印 b ),在你从文具袋里拿去物品(调用函数)并且放到桌子上,你桌子上永远都会是那支笔

    我水平有限,解释的不好见谅
    Mistwave
    Mistwave
    Dec 5, 2019 via iPhone
    78
    b = "a"+my_time()
    这里是 call by value,而不是 call by name
    leeleelee
    leeleelee
    Dec 5, 2019 via Android
    79
    @KaynW 知识的诅咒
    xuyl
    xuyl
    Dec 5, 2019 via Android
    80
    要不转行吧
    winglight2016
    winglight2016
    Dec 5, 2019
    81
    唉,要不还是转行吧
    lewinlan
    lewinlan
    Dec 5, 2019
    82
    唉,要不还是转行吧

    变量想象成是一个标签,你赋值给谁它就代表谁。你令『 b = "a"+my_time()』,程序会把右边的*值*计算出来,然后给这个*值*贴上『 b 』这个标签,所以你每次访问都是同一个值。

    另外,你打印时间字符串可以用『 datetime.now().strftime("%Y%m%d")』你那样写太别扭了。
    nomaka
    nomaka
    Dec 5, 2019
    83
    唉,要不还是转行吧
    ztmqg
    ztmqg
    Dec 5, 2019 via iPhone
    84
    楼主别听他们的,加油吧!
    楼上的复读机有意思么?
    vipppppp
    vipppppp
    Dec 5, 2019
    85
    。。。
    liuzhiyong
    liuzhiyong
    Dec 5, 2019
    86
    楼主应该是初学啦。“变量是什么”:就是计算机内存里面保存的一些数据。“什么时候变,什么时候不变?”:计算机 CPU 执行修改内存的指令,它就变了,如果 CPU 执行读取内存的指令,它当然不变。
    nG29DOMuRYTWfcSr
    nG29DOMuRYTWfcSr
    Dec 5, 2019
    87
    @css3 楼上所有人都是只会人云亦云,自己一点脑子没有的人,这种问题难道真的没有实现方式么?

    输入,b,实际上是调用 b 的 tostring 函数,哪怕是我真的没有深入学过 python, 我都知道任意面向对象类型的语言都可以实现这样的事情。
    leafsummer
    leafsummer
    Dec 5, 2019
    88
    唉,要不还是转行吧
    smdbh
    smdbh
    Dec 5, 2019 via iPhone
    89
    @j0hnj 谢谢指明了我的人生方向,这比告诉我答案意义更大。

    这个问题和深拷贝,指针,引用等,都是语言的“通病”,就像 1024 一样习惯就好
    asche910
    asche910
    Dec 5, 2019
    90
    唉,要不还是转行吧
    vipppppp
    vipppppp
    Dec 5, 2019
    91
    我只是觉得大家没必要探讨 python 的__str__问题
    劝转行是有点过分,但在这个论坛看到这样的问题确实相对太过于基础,难免有点震惊。
    无论怎么样,还是要学好最基本的一些编程知识,LZ 加油。。
    bjt
    bjt
    Dec 5, 2019
    92
    唉,要不还是转行吧
    GooooooniX
    GooooooniX
    Dec 5, 2019
    93
    楼主不要灰心。。。
    你发现了更大到世界。
    CEBBCAT
    CEBBCAT
    Dec 5, 2019
    94
    > 为什么在 b 变量里边 my_time()不再被调用了??
    你给 b 赋值(比如 b = a + XXX )的时候,值已经固定了,是一个像'a2019-12-05 11:30:32'一样的字符串,你可以用 type(b)来验证。
    > 直接打印 print("a"+my_time())时,my_time()每次都会被调用
    print 里边的"a"+my_time()是一个表达式,所以每次执行都会对 my_time()求值
    > 我要在 b 变量中时时更新 my_time()应该怎么做?
    def b():
    return "a"+my_time()
    > 变量是什么😂,什么时候变,什么时候不变?
    基础问题,请完整看完一本编程书再问这样的问题。
    ---
    楼主什么身份?行外的朋友?要是培训班出来能被这几个问题难住,我想这个培训班把你和行业坑得不轻
    zhjie
    zhjie
    Dec 5, 2019
    95
    真不是我偏见,10 个钓鱼的 9 个是苹果头像!?
    ahaxzh
    ahaxzh
    Dec 6, 2019
    96
    哎,还挺难的。不然跟我回家养猪算了。
    css3
    css3
    OP
    Dec 6, 2019
    97
    @ahaxzh 可以,但养猪前,能先让我明白我问的问题这是为什么吗?
    chucongqing
    chucongqing
    Dec 6, 2019
    98
    一楼二楼都点赞了
    finalwave
    finalwave
    Dec 6, 2019
    99
    都叫 css3 了,不做前端学什么 python
    dfourc
    dfourc
    Dec 6, 2019
    100
    @css3 #97 上面的大佬已经多种维度来解释了,还是看不懂的建议先看一些编程基础
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2708 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 217ms · UTC 04:16 · PVG 12:16 · LAX 20:16 · JFK 23:16
    ♥ Do have faith in what you're doing.