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 · 23 小时 8 分钟前 · 3108 次点击

    已知如下 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 条附言  ·  19 小时 13 分钟前
    我开始是发在“好玩”板块的,大家当个乐子就行,忽略“面试”。。。
    39 条回复    2026-04-01 17:54:29 +08:00
    uorz
        1
    uorz  
       23 小时 3 分钟前 via Android
    Gemini: yield.
    maolon
        2
    maolon  
       22 小时 57 分钟前


    你确定你问对了 ai ?
    uorz
        3
    uorz  
       22 小时 56 分钟前 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  
       22 小时 54 分钟前 via Android
    For script: yield
    For repl: return print("\033[1A\033[2K", end="")
    leiuu
        5
    leiuu  
       22 小时 42 分钟前
    gemini 网页:直接答对✅
    claude 客户端 sonnet 4.6:经过提示答对✅
    chatgpt 网页免费版:经过提示答对✅

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


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

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

    if (1) for(;printf("hellp world"),0;) {
    printf("hello");
    }
    else
    {
    printf("world");
    }
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5342 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:21 · PVG 09:21 · LAX 18:21 · JFK 21:21
    ♥ Do have faith in what you're doing.