How to do variable assignment inside a while(expression) loop in Python?

前端 未结 6 1844
离开以前
离开以前 2020-12-08 22:30

I have the variable assignment in order to return the assigned value and compare that to an empty string, directly in the while loop.

Here is how I\'m doing it in PH

相关标签:
6条回答
  • 2020-12-08 22:40

    No, sorry. It's a FAQ, explained well here:

    In Pydocs, and Fredrik Lundh's blog.

    The reason for not allowing assignment in Python expressions is a common, hard-to-find bug in those other languages.

    Many alternatives have been proposed. Most are hacks that save some typing but use arbitrary or cryptic syntax or keywords, and fail the simple criterion for language change proposals: it should intuitively suggest the proper meaning to a human reader who has not yet been introduced to the construct.

    An interesting phenomenon is that most experienced Python programmers recognize the while True idiom and don’t seem to be missing the assignment in expression construct much; it’s only newcomers who express a strong desire to add this to the language.

    There’s an alternative way of spelling this that seems attractive:

    line = f.readline() while line:
        ... # do something with line...
        line = f.readline()
    
    0 讨论(0)
  • 2020-12-08 22:48

    You can wrap raw_input() to turn it into a generator:

    def wrapper(s):
        while True:
            result = raw_input(s)
            if result = '': break
            yield result
    
    names = wrapper('Name:')
    

    which means we're back to square one but with more complex code. So if you need to wrap an existing method, you need to use nosklo's approach.

    0 讨论(0)
  • 2020-12-08 22:50

    PEP 572 proposes Assignment Expressions and has already been accepted. Starting with Python 3.8, you will be able to write:

    while name := input("Name: "):
        names.append(name)
    

    Quoting the Syntax and semantics part of the PEP for some more examples:

    # Handle a matched regex
    if (match := pattern.search(data)) is not None:
        # Do something with match
    
    # A loop that can't be trivially rewritten using 2-arg iter()
    while chunk := file.read(8192):
       process(chunk)
    
    # Reuse a value that's expensive to compute
    [y := f(x), y**2, y**3]
    
    # Share a subexpression between a comprehension filter clause and its output
    filtered_data = [y for x in data if (y := f(x)) is not None]
    
    0 讨论(0)
  • 2020-12-08 22:51
    names = []
    for name in iter(lambda: raw_input("Name: "), ''):
        names.append(name)
    
    0 讨论(0)
  • 2020-12-08 22:56

    I'm only 7 years late, but there's another solution. It's not the best solution I can think of, but it highlights an interesting use of the StopIteration exception. You can do a similar loop for chunk reading files/sockets and handle Timeouts and whatnot nicely.

    names=[]
    try:
        while True:
            f = raw_input()
            if not f:
                raise StopIteration
            else:
                names.append(f)
    except StopIteration:
        pass
    
    print names
    
    0 讨论(0)
  • 2020-12-08 22:59
    from functools import partial
    
    for name in iter(partial(raw_input, 'Name:'), ''):
        do_something_with(name)
    

    or if you want a list:

    >>> names = list(iter(partial(raw_input, 'Name: '), ''))
    Name: nosklo
    Name: Andreas
    Name: Aaron
    Name: Phil
    Name: 
    >>> names
    ['nosklo', 'Andreas', 'Aaron', 'Phil']
    
    0 讨论(0)
提交回复
热议问题