V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
xFrank
V2EX  ›  Python

发现 Python 一个有意思的小特性,发现很合适搞成面试题。问了 AI 都不行:),欢迎来挑战~

  •  
  •   xFrank · 1 天前 · 3430 次点击

    已知如下 python 代码文件(已经是全部内容):

    def foo():
        print("start")
        xxxxxx
        print("end")
    if __name__ == "__main__":   
        print("1111")  
        foo()
        print("2222")
    
    问题:请将 xxxxx 替换为一行 python 代码,使这个 python 文件执行后最终输出只有 1111 和 2222
    替换代码要求:只能有一个语句,只有一行;多个语句组合的不行( import 也算一个语句,因此类似 import sys; sys.xxx 的不行)
    

    引申问题:上述替换代码要求放宽为“允许引入自带库并允许多条语句”,是否还有别的方案?

    第 1 条附言  ·  1 天前
    我开始是发在“好玩”板块的,大家当个乐子就行,忽略“面试”。。。
    41 条回复    2026-04-02 11:18:17 +08:00
    uorz
        1
    uorz  
       1 天前 via Android
    Gemini: yield.
    maolon
        2
    maolon  
       1 天前


    你确定你问对了 ai ?
    uorz
        3
    uorz  
       1 天前 via Android
    I completely get why you wouldn't want REPL clutter! Seeing `<generator object foo at 0x...>` splashed across your screen ruins the clean `1111` and `2222` output you're aiming for.

    But here is the good news: **you actually won't see the generator object printed, even in a REPL.** Here is a reality check on how Python environments handle this:

    ### 1. The Block Rule (Why you are already safe)
    In a standard Python REPL, Jupyter Notebook, or IPython, the interpreter only auto-prints the result of an expression if it's evaluated at the **top level**.

    Because your `foo()` call is nested inside the `if __name__ == "__main__":` block, the REPL treats the entire block as a single execution unit. It does not automatically echo the return values of expressions inside that block. It will silently create the generator, discard it, and move right along to `print("2222")`.

    ### 2. Testing Standalone
    If your concern is that you are calling `foo()` *by itself* in the REPL just to test it (outside of the `if` block), then yes, the REPL will aggressively print the generator. To suppress that, simply assign it to a throwaway variable:

    ```python
    _ = foo()
    ```

    ---

    ### The "Chaotic Evil" Terminal Hack (No `yield` required)
    If you absolutely despise the `yield` solution and want a completely different 1-line hack that isn't a generator, you can use an ANSI escape sequence.

    Replace `xxxxxx` with:

    ```python
    return print("\033[1A\033[2K", end="")
    ```

    **Why this works:**
    1. Python executes `print("start")`, which outputs `start` and moves the cursor to the next line.
    2. The `return print(...)` line executes.
    3. `\033[1A` tells your terminal to move the cursor **up** one line (back to where `start` is).
    4. `\033[2K` tells your terminal to **erase** that entire line.
    5. `end=""` prevents this hacky print statement from adding a new line of its own.
    6. The `return` immediately exits the function, so `print("end")` is never executed.

    The terminal completely deletes the evidence that `print("start")` ever happened, leaving you with just `1111` and `2222`. *(Note: This is a fun terminal UI trick, so it only works in environments that support ANSI formatting!)*
    uorz
        4
    uorz  
       1 天前 via Android
    For script: yield
    For repl: return print("\033[1A\033[2K", end="")
    leiuu
        5
    leiuu  
       1 天前
    gemini 网页:直接答对✅
    claude 客户端 sonnet 4.6:经过提示答对✅
    chatgpt 网页免费版:经过提示答对✅

    提示类似:“思路不对啊 有一个关键字可以做到“
    uorz
        6
    uorz  
       1 天前 via Android   ❤️ 2
    现在这个时代,面试这种 tricky 问题根本没有任何意义,跟以前 c 时代考各种指针写法一个道理。AI 比你我更了解各种语言细节。
    CatCode
        7
    CatCode  
       1 天前
    审核代码的人:这么写代码的,还提交进代码库的,建议直接开了。
    tianjiyao
        8
    tianjiyao  
       1 天前
    奇淫巧技不足道也。。。
    lchkid
        9
    lchkid  
       1 天前


    啥 AI 不行啊?我测了下连豆包都行
    yuruizhe
        10
    yuruizhe  
       1 天前
    这纯考 python 语法细节啊
    不涉及任何算法
    下次可以整个考查装饰器的题目
    weixind
        11
    weixind  
       1 天前
    你们面试目的是为了考倒候选人?
    whoosy
        12
    whoosy  
       1 天前   ❤️ 5
    何意味?麻烦你说下公司名,我避下雷
    blakezhaothinks
        13
    blakezhaothinks  
       1 天前
    这种奇技淫巧每种语言都有很多,拿来做面试题属实逆天,就算 CPython 核心开发者也不一定了解每个细节。
    blakezhaothinks
        14
    blakezhaothinks  
       1 天前
    @blakezhaothinks 不过 yield 也算不上奇技淫巧,当我没说 😄
    soleils
        15
    soleils  
       1 天前
    你面试是为了招人来干活还是为了出些"奥数"题目把人考倒看乐子?
    xFrank
        16
    xFrank  
    OP
       1 天前
    我错了,给大家带来了不好的影响,麻烦管理员删除帖子。怎么 @管理员?
    uorz
        17
    uorz  
       1 天前 via Android
    我相信你内心是希望面试人回答 yield 的。经过提示,Gemini 还给出了`[__import__('os').system('cls' if __import__('os').name == 'nt' else 'clear'), print("1111"), __import__('sys').exit(print("2222"))]`这样的答案。是不是面试人没回答到心坎里去就 pass 掉?
    kaliawngV2
        18
    kaliawngV2  
       1 天前 via Android
    @xFrank 你也不希望被 v 友骂吧,v 我 50 ,我帮你删帖
    deplives
        19
    deplives  
       1 天前
    emmmm 用这个当面试题,赶紧发下公司名给网友避避雷
    back0893
        20
    back0893  
       1 天前
    ? 这种面试题是为了什么?
    jackOff
        21
    jackOff  
       1 天前
    ? 这种面试题是为了什么?
    fkdtz
        22
    fkdtz  
       1 天前   ❤️ 1
    我承认挑战失败,憋笑挑战
    mynameislihua
        23
    mynameislihua  
       1 天前 via Android
    招个人机去你们公司
    bu9
        24
    bu9  
       1 天前
    你居然想用八股难为 ai ,还不认为自己想法有问题?
    mrji1990
        25
    mrji1990  
       1 天前
    毫无意义
    Vaspike
        26
    Vaspike  
       1 天前
    面试题的角度来说确实不太合理, 但对我来说我确实学习到了一个 py 语法
    hackerfans
        27
    hackerfans  
       1 天前
    get
    Gilfoyle26
        28
    Gilfoyle26  
       1 天前
    opus 4.6:总有人觉的自己比我聪明,结果就是啪啪打脸。
    xFrank
        29
    xFrank  
    OP
       1 天前
    @uorz #1 我啥我问 Gemini 就不行呢。。。
    NoobPhper
        30
    NoobPhper  
       1 天前
    你门公司叫啥啊
    xFrank
        31
    xFrank  
    OP
       1 天前
    @NoobPhper 碳基生物静息能效管理中心
    qiuhang
        32
    qiuhang  
       1 天前
    yield 把它变成迭代器这种东西,用来面试的话,纯纯脑筋急转弯,典型的小聪明
    qiuhang
        33
    qiuhang  
       1 天前
    yield 把它变成迭代器进而避开函数调用这种东西,用来面试的话,纯纯脑筋急转弯,典型的小聪明
    CodeCodeStudy
        34
    CodeCodeStudy  
       1 天前
    yield 把函数的代码变成迭代器,所以 foo 里面的代码不会被执行。我问了千问、元宝的 DeepSeek 、百度的 DeepSeek 、智谱清言,没一个答对的
    workbest
        35
    workbest  
       1 天前
    学了一招,谢谢题主
    finab
        36
    finab  
       1 天前
    想到一个 C 语言的题, 填空要求打印 hello world

    if (____) {
    printf("hello");
    }
    else {
    printf("world");
    }
    Sawyerhou
        37
    Sawyerhou  
       1 天前   ❤️ 1
    这个帖子能让这么多人破防,我是属实没想到。
    CodeCodeStudy
        38
    CodeCodeStudy  
       1 天前
    把千问、元宝的 DeepSeek 、百度的 DeepSeek 、智谱清言这几个的大脑都干爆了,都没一个回答争取,好玩
    moudy
        39
    moudy  
       1 天前
    @finab

    if (1) for(;printf("hellp world"),0;) {
    printf("hello");
    }
    else
    {
    printf("world");
    }
    lmqdlr
        40
    lmqdlr  
       20 小时 13 分钟前
    @Sawyerhou 不是破防,要是不说当面试题一点问题都没有(看起来贴主其实也没什么坏心思,只是发现了知识点迫不及待分享)。
    大家反对的是面试时候的问一些,知道也就知道了,不知道也没有任何影响的奇技淫巧
    Sawyerhou
        41
    Sawyerhou  
       19 小时 37 分钟前
    @lmqdlr #40 我不是理解不了楼里回复的内容,我是没想到这么多人因为这个 python 特性不适合用来面试,而直接产生面试答不上的挫败感,然后直接应激,完全忽略了“面试”根本不是这个帖子的重点。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 22:56 · PVG 06:56 · LAX 15:56 · JFK 18:56
    ♥ Do have faith in what you're doing.