Цикл списков — Учебник Python — Schoolsw3.com
schoolsw3.com
САМОСТОЯТЕЛЬНОЕ ОБУЧЕНИЕ ДЛЯ ВЕБ РАЗРАБОТЧИКОВ
❮ Назад Далее ❯
Цикл по списку
Вы можете просмотреть элементы списка, используя цикл for:
Пример
Распечатайте все элементы в списке, один за другим:
thislist = [«яблоко», «банан», «вишня»]
for x in thislist:
print(x)
Попробуйте сами »
Узнайте больше о циклах for
в главе Циклы Python.
Цикл по номерам индексов
Вы также можете прокручивать элементы списка, обращаясь к их порядковому номеру.
Используйте функции range()
и
len()
для создания подходящего итерируемого объекта.
Пример
Распечатайте все элементы, ссылаясь на их порядковый номер:
thislist = [«яблоко», «банан», «вишня»]
for i
in range(len(thislist)):
print(thislist[i])
Попробуйте сами »
Итерируемый объект, созданный в приведенном выше примере, имеет значение
.
Использование цикла while
Вы можете просмотреть элементы списка, используя цикл while.
Используйте функцию len()
чтобы определить длину списка,
затем начните с 0 и прокручивайте элементы списка, обращаясь к их индексам.
Не забывайте увеличивать индекс на 1 после каждой итерации.
Пример
Распечатайте все элементы, используя цикл while
для просмотра всех номеров индексов.
thislist = [«яблоко», «банан», «вишня»]
i = 0
while i < len(thislist):
print(thislist[i])
i = i + 1
Попробуйте сами »
Читайте больше о цикле while
в главе
Циклы Python.
Зацикливание с помощью понимания списка
Понимание списка предлагает кратчайший синтаксис для перебора списков:
Пример
Короткая рука цикла for
который будет печатать все элементы в списке:
thislist = [«яблоко», «банан», «вишня»]
[print(x) for x in thislist]
Попробуйте сами »
Узнайте больше о распознавании списков в следующей главе: Понимание списков. .
❮ Назад Далее ❯
ВЫБОР ЦВЕТА
ТОП Учебники
HTML УчебникCSS Учебник
JavaScript Учебник
КАК Учебник
SQL Учебник
Python Учебник
W3.CSS Учебник
Bootstrap Учебник
PHP Учебник
Java Учебник
C++ Учебник
jQuery Учебник
ТОП Справочники
HTML СправочникCSS Справочник
JavaScript Справочник
SQL Справочник
Python Справочник
W3.CSS Справочник
Bootstrap Справочник
PHP Справочник
HTML Цвета
Java Справочник
Angular Справочник
jQuery Справочник
ТОП Примеры
HTML ПримерыCSS Примеры
КАК Примеры
SQL Примеры
Python Примеры
W3.CSS Примеры
Bootstrap Примеры
PHP Примеры
Java Примеры
XML Примеры
jQuery Примеры
Форум | О SchoolsW3
SchoolsW3 оптимизирован для бесплатного обучения, проверки и подготовки знаний. Примеры в редакторе упрощают и улучшают чтение и базовое понимание. Учебники, ссылки, примеры постоянно пересматриваются, чтобы избежать ошибок, но не возможно гарантировать полную правильность всего содержания. Некоторые страницы сайта могут быть не переведены на РУССКИЙ язык, можно отправить страницу как ошибку, так же можете самостоятельно заняться переводом. Используя данный сайт, вы соглашаетесь прочитать и принять Условия к использованию, Cookies и политика конфиденциальности.
Авторское право 1999- Все права защищены.
SchoolsW3 работает на площадке от SW3.CSS.
8.2) Операторы циклов — Разные уроки по Программированию
Главная > Основы программирования > 08) Операторы языка С++ > 8.2) Операторы циклов
|
mysql — Использование цикла while в SQL-запросе — он продолжает вставлять запись без перерыва
Я использую цикл while для перемещения добавочных данных из старой таблицы в новые таблицы после того, как я изменю столбец идентификаторов с INT на BigInt. Я восстановил 1 миллиард записей. Но все же есть добавочные данные, которые мне нужно переместить в новую таблицу. В настоящее время я работаю над вставкой добавочных данных из старой таблицы в новую таблицу. Поэтому я взял max(hist_id) из промежуточных таблиц и настроил его как значение параметра в таблице параметров как @hist_id_start. Пакет будет запускаться 100k один раз. Следовательно, он будет искать hist_id из старой таблицы и вставлять до тех пор, пока все новые записи не будут вставлены в новую таблицу. Приведенный ниже запрос не работает. Например, начало hist_id равно 6709.и он должен вставлять 1000 записей в пакеты и останавливаться, как только он достигает 13218, но каким-то образом он продолжает зацикливаться и вставлять нежелательные записи.
Это образец записи: он начинается с 6709, и я добавляю 1000 записей 7709, и он должен вставляться, пока не достигнет 13218.
DECLARE @hist_id_start INT; DECLARE @hist_id_end INT; DECLARE @hist_id_max INT; DECLARE @batchcount INT; DECLARE @reccount INT; УСТАНОВИТЕ @batchcount = 1000 ВЫБЕРИТЕ @hist_id_start = value_text из PARAMETER (NOLOCK) WHERE PARAMETER_NAME='DIST_PRODUCT_COST_HIST_ID_INCREMENTAL' SET @hist_id_end= (@hist_id_start + @batchcount) установить @hist_id_max= (выбрать max(hist_id) из DIST_PRODUCT_COST_HIST с (без блокировки)) SELECT @reccount = count(*) from dist_product_cost_hist (nolock) WHERE hist_id >=@hist_id_start и hist_id < (@hist_id_end) PRINT 'hist_id_start: ' + convert(nvarchar(20), @hist_id_start) PRINT 'hist_id_end: ' + convert(nvarchar(20), @hist_id_end) PRINT 'Количество записей: ' + convert(nvarchar(20), @reccount) PRINT 'hist_id_max: ' + convert(nvarchar(20), @hist_id_max) в то время как(@hist_id_end=<@hist_id_max) --select IDENT_CURRENT('dist_product_cost_hist') - число всегда должно быть меньше SELECT value_text from PARAMETER (NOLOCK) WHERE PARAMETER_NAME='DIST_PRODUCT_COST_HIST_ID' начинать ВСТАВИТЬ В Dist_Product_Cost_Hist_2022(dist_id,dist_sku_num,cost_type_code,cost_ref_num,cost,eff_date,end_date,manual_flag,currency_code,update_dts,update_uid,row_id) ВЫБЕРИТЕ dist_id,dist_sku_num,cost_type_code,cost_ref_num,cost,eff_date,end_date,manual_flag,currency_code,update_dts,update_uid,row_id FROM Dist_Product_Cost_Hist (без блокировки) ГДЕ hist_id > =@hist_id_start и hist_id < (@hist_id_end) -- Обновить последний hist_id в таблице параметров ОБНОВИТЬ ПАРАМЕТР установить value_text=@hist_id_end, update_dts =getdate() ГДЕ PARAMETER_NAME='DIST_PRODUCT_COST_HIST_ID_INCREMENTAL' конец
- mysql
- sql
- sql-сервер
- циклы
- цикл while
6
Вам необходимо увеличивать @hist_id_end после каждой итерации:
while(@hist_id_end=<@hist_id_max) --select IDENT_CURRENT('dist_product_cost_hist') - число всегда должно быть меньше SELECT value_text from PARAMETER (NOLOCK) WHERE PARAMETER_NAME='DIST_PRODUCT_COST_HIST_ID' начинать ВСТАВИТЬ В Dist_Product_Cost_Hist_2022(dist_id,dist_sku_num,cost_type_code,cost_ref_num,cost,eff_date,end_date,manual_flag,currency_code,update_dts,update_uid,row_id) ВЫБЕРИТЕ dist_id,dist_sku_num,cost_type_code,cost_ref_num,cost,eff_date,end_date,manual_flag,currency_code,update_dts,update_uid,row_id FROM Dist_Product_Cost_Hist (без блокировки) ГДЕ hist_id >=@hist_id_start и hist_id < (@hist_id_end) -- Обновить последний hist_id в таблице параметров ОБНОВИТЬ ПАРАМЕТР установить value_text=@hist_id_end, update_dts =getdate() ГДЕ PARAMETER_NAME='DIST_PRODUCT_COST_HIST_ID_INCREMENTAL' НАБОР @hist_id_end = @hist_id_end + @batchcount конец
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Цикл SQL Server WHILE запускается дважды с обновлением, один раз без
Задавать вопрос
спросил
Изменено 1 год, 1 месяц назад
Просмотрено 872 раза
Вот это странно. Вот мой код:
PRINT 'Определить курсор' ОБЪЯВИТЬ cursor1 КУРСОР ДЛЯ ВЫБЕРИТЕ b.EmploymentTypeID FROM EmploymentTypes b INNER JOIN #ListEmployments l на b.EmploymentID = l.EmploymentID PRINT 'Открыть курсор' ОТКРЫТЬ курсор1 FETCH NEXT FROM cursor1 INTO @pEmploymentTypeID ПОКА @@FETCH_STATUS = 0 НАЧИНАТЬ PRINT '1) Внутри цикла WHILE. @pEmploymentTypeID: ' + convert(varchar(20), @pEmploymentTypeID) PRINT '2) Внутри цикла WHILE. @@FETCH_STATUS: ' + convert(varchar(20), @@FETCH_STATUS) -- поработай немного ОБНОВЛЕНИЕ SETEmploymentTypeRD = EmploymentTypeID ГДЕEmploymentTypeID = @pEmploymentTypeID И тип занятостиRD = 0 PRINT '3) Внутри цикла WHILE. Pre-FETCH @@FETCH_STATUS: ' + convert(varchar(20), @@FETCH_STATUS) FETCH NEXT FROM cursor1 INTO @pEmploymentTypeID PRINT '4) Внутри цикла WHILE. Пост-FETCH @@FETCH_STATUS: ' + convert(varchar(20), @@FETCH_STATUS) КОНЕЦ ЗАКРЫТЬ курсор1 УДАЛИТЬ курсор1
Когда я запускаю это, цикл выполняется дважды, и я вижу следующий вывод.
Определить курсор Открытый курсор 1) Внутри цикла WHILE. @pEmploymentTypeID: 695837 2) Внутри цикла WHILE. @@FETCH_STATUS: 0 3) Внутри цикла WHILE. Предварительная выборка @@FETCH_STATUS: 0 4) Внутри цикла WHILE. Пост-FETCH @@FETCH_STATUS: 0 1) Внутри цикла WHILE. @pEmploymentTypeID: 695837 2) Внутри цикла WHILE. @@FETCH_STATUS: 0 3) Внутри цикла WHILE. Предварительная выборка @@FETCH_STATUS: 0 4) Внутри цикла WHILE. Пост-FETCH @@FETCH_STATUS: -1 Убежал в ROLLBACK
Если я закомментирую оператор UPDATE после комментария «--поработайте», вывод будет следующим:
Определить курсор Открытый курсор 1) Внутри цикла WHILE. @pEmploymentTypeID: 695837 2) Внутри цикла WHILE. @@FETCH_STATUS: 0 3) Внутри цикла WHILE. Предварительная выборка @@FETCH_STATUS: 0 4) Внутри цикла WHILE. Пост-FETCH @@FETCH_STATUS: -1 Убежал в ROLLBACK
Почему цикл выполняется дважды при включенном обновлении?
- sql-сервер
1
Вы столкнулись с проблемой, более известной как проблема Хэллоуина , другими словами, вы читаете только что измененные строки.
Это одна из многих причин, по которым вам не следует использовать курсор.
Вместо этого выполните простое совместное обновление. Это один оператор , который выполняет все в вашем скрипте. Сервер имеет специальную логику для учета изменяемых строк при чтении.
ОБНОВЛЕНИЕ и др. SETEmploymentTypeRD = EmploymentTypeID ОТ EmploymentTypes et ВНУТРЕННЕЕ СОЕДИНЕНИЕ #ListEmployments l ON et.EmploymentID = l.EmploymentID ГДЕ et.EmploymentTypeRD = 0;
Лучше всего для этого подходит операция на основе SET. Однако, если вы должны использовать курсор или просто хотите узнать, почему он работает не так, как вы ожидаете...
Вы обновляете строки базовых таблиц, используемых курсором, а затем заставляете его возвращать дополнительную строку после первого обновления. Обновление во время второго цикла ничего не делает, потому что EmploymentTypeRD больше не равен 0, значит, курсор существует. Попробуйте добавить аргумент STATIC к объявлению курсора. Это кэширует результаты курсора во временную таблицу в том состоянии, в котором они существовали до начала цикла и выполнения любых обновлений.
Просмотрите документацию Microsoft по аргументам курсора здесь: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-ver15
Ниже приведен измененный код.
ПЕЧАТЬ 'Определить курсор' ОБЪЯВИТЬ cursor1 CURSOR **STATIC** ДЛЯ ВЫБЕРИТЕ b.EmploymentTypeID FROM EmploymentTypes b INNER JOIN #ListEmployments l на b.EmploymentID = l.EmploymentID PRINT 'Открыть курсор' ОТКРЫТЬ курсор1 FETCH NEXT FROM cursor1 INTO @pEmploymentTypeID ПОКА @@FETCH_STATUS = 0 НАЧИНАТЬ PRINT '1) Внутри цикла WHILE. @pEmploymentTypeID: ' + convert(varchar(20), @pEmploymentTypeID) PRINT '2) Внутри цикла WHILE. @@FETCH_STATUS: ' + convert(varchar(20), @@FETCH_STATUS) -- поработай немного ОБНОВЛЕНИЕ SETEmploymentTypeRD = EmploymentTypeID ГДЕEmploymentTypeID = @pEmploymentTypeID И тип занятостиRD = 0 PRINT '3) Внутри цикла WHILE.