Python ленивый итератор

Я пытаюсь понять, как и когда выражения итератора оценены. Следующее, кажется, ленивое выражение:

g = (i for i in range(1000) if i % 3 == i % 2)

Этот, однако сбои на конструкции:

g = (line.strip() for line in open('xxx', 'r') if len(line) > 10)

У меня нет файла названным 'xxx'. Однако, так как эта вещь ленива, почему она перестала работать так скоро?

Спасибо.

EDI: Ничего себе, я сделал ленивый!

g = (line.strip() for i in range(3) for line in open(str(i), 'r'))
5
задан Hamish Grubijan 12 February 2010 в 04:29
поделиться

2 ответа

Из документации :

Переменные, используемые в выражении генератора , лениво вычисляются в отдельной области, когда next () Метод вызывается для объекта генератора (так же, как для обычных генераторов ). Однако выражение in крайнего левого предложения for немедленно оценивается в текущей области , поэтому возникает ошибка {{ 1}} можно увидеть перед любой другой возможной ошибкой в ​​коде, который обрабатывает выражение генератора.

4
ответ дан 13 December 2019 в 22:07
поделиться

То же, что и в .NET :

$DateStr = $Date.ToString("yyyyMMdd")

Или:

$DateStr = '{0:yyyyMMdd}' -f $Date
-121-2015874-

Вы хотите использовать команду am . Скажите, что у вас есть Манифест, который выглядит примерно так:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.MyApp">
    <application android:icon="@drawable/icon">
        <activity class=".MyMainActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:value="android.intent.action.MAIN" />
                <category android:value="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    ...
</manifest>

вы бы начали это с:

adb shell am start -a android.intent.action.MAIN -n com.example.MyApp/.MyMainActivity

, хотя вы можете сказать ему, чтобы подождать, пока он не будет готов:

adb wait-for-device shell am start -a android.intent.action.MAIN -n com.example.MyApp/.MyMainActivity

В основном вы просто увольняете Намерение , которое вызывает основное действие вашего пакета.

Полная документация (от запуска am --help):

usage: am [start|broadcast|instrument|profile]
       am start [-D] INTENT
       am broadcast INTENT
       am instrument [-r] [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
                [-w] <COMPONENT> 
       am profile <PROCESS> [start <PROF_FILE>|stop]

       INTENT is described with:
                [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
                [-c <CATEGORY> [-c <CATEGORY>] ...]
                [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
                [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
                [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
                [-n <COMPONENT>] [-f <FLAGS>] [<URI>]
-121--5086073-

Итерация по файлу, возвращенному вызовом open () , является ленивой. Вызов open () не является вызовом.

6
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: