Как переписать цикл, чтобы сделать шаг 0.01?
TypeError Traceback (most recent call last) in 2 print(type(x)) 3 sum1=0 —-> 4 for x in range(-math.pi,math.pi,0.01): 5 k=1 6 for k in range(N+1): TypeError: ‘float’ object cannot be interpreted as an integer
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 3 окт 2019 в 17:45
379 1 1 золотой знак 5 5 серебряных знаков 16 16 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Range не принимает float аргументы. Вам придется цикл сделать иначе
x = -math.pi while x < math.pi : x+= 0.01
Отслеживать
ответ дан 3 окт 2019 в 17:49
16.4k 2 2 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака
Почему бы вам не использовать модуль Numpy более широко?
x=0 N=5 sum1=0 for x in np.arange(-np.pi, np.pi, 0.01): for k in range(1, N+1): sum1+=(np.sign((2*k-1)*x))/(2*k-1)*(4/np.pi) sum1=sum1*(4/np.pi)
In [154]: print(sum1) -1.0326167037008748e+67
PS судя по результату, стремящемуся к минус бесконечности, у вас ошибка в формуле.
PPS скорее всего формулу можно реализовать без циклов, используя векторизированные Numpy функции, но для этого понадобится более подробное описание формулы.
Помощники цикла for в Python
![]()
В языке Python заложено много полезных инструментов, способных значительно упростить жизнь разработчику, если о них знать и уметь использовать. Мы рассмотрим четыре функции, которые помогут нам при работе с циклом for, а в некоторых случаях позволят вообще отказаться от него!
О операторах ветвления и циклах написано в уроке “Python. Урок 5. Условные операторы и циклы”.
В статье рассмотрим следующие функции:
Функция range
Функция range() создает объект, который внутри себя содержит итератор, выдающий элементы из диапазона, определяемого аргументами функции.
Создадим объект range .
>>> r = range(3)
Получим его итератор.
>>> ri = iter(r)
Используя next() , извлечем из него все элементы.
>>> next(ri) 0 >>> next(ri) 1 >>> next(ri) 2 >>> next(ri) Traceback (most recent call last): File "", line 1, in next(ri) StopIteration
Через параметры функции range можно задать диапазон и шаг. Создадим range , генерирующий числа от 1 до 10 с шагом 3.
>>> ri2 = iter(range(1,10,3)) >>> next(ri2) 1 >>> next(ri2) 4 >>> next(ri2) 7 >>> next(ri2) Traceback (most recent call last): File "", line 1, in next(ri2) StopIteration
Объект range идеально подходит для использования в цикле for . Работа цикла for организована следующим образом:
- получаем итератор у объекта, который предоставляет данные;
- используя функцию next() , извлекаем элементы на каждой итерации цикла;
- если произошел выброс исключения StopIteration , то выходим из цикла.
Пример: выведем список целых чисел от 0 до 2 на экран.
>>> for i in range(3): print(i) 0 1 2
Список чисел от 1 до 10 с шагом 2.
>>> for i in range(1, 10, 2): print(i) 1 3 5 7 9
Range можно использовать в List Comprehensions .
>>> [i for i in range(3)] [0, 1, 2]
Функция range() – мощный инструмент, позволяющий получать последовательности целых чисел в заданном диапазоне с определенным шагом, с доступом через итератор.
Функция enumerate
Функция enumerate() конструирует генератор по переданной в нее (через аргумент) объект. Она предоставляет кортежи, состоящие из двух элементов, первый из которых – индекс, а второй – значение, извлекаемое из объекта.
Рассмотрим простой пример: найти в строке первое вхождение символа ‘o’ и вывести номер его позиции. Эта задача может быть решена так.
>>> msg = "hello!" >>> i = 0 >>> for sym in msg: if sym == 'o': print("index font-weight: 400;">В этой программе нам пришлось заводить дополнительную переменную i, значение которой на каждой итерации цикла мы увеличивали на единицу. Это не очень удобно! Использование функции enumerate() позволит упростить решение. >>> msg = "hello!" >>> for tp in enumerate(msg): if 'o' in tp: print("index font-weight: 400;">В процессе работы цикла for из объекта, созданного функцией enumerate(), будут последовательно извлекаться следующие кортежи: (0, ‘h’) (1, ‘e’) (2, ‘l’) (3, ‘l’) (4, ‘o’)
После извлечения кортежа (4, ‘o’) , на экран выведется соответствующее сообщение и цикл завершится. Выведем все кортежи, получаемые из строки “hello!” с помощью функции enumerate() .
>>> for tp in enumerate(msg): print(tp) (0, 'h') (1, 'e') (2, 'l') (3, 'l') (4, 'o') (5, '!')
Функция enumerate() позволяет получить индексы элементов объекта при обходе его в цикле for без введения дополнительных переменных.
Функция map
Функция map() предоставляет возможность применить указанную функцию к каждому элементу объекта. В результате получим список из модифицированных элементов исходного объекта.
Решим задачу возведения в квадрат всех элементов списка с использованием цикла for .
>>> numbers = [1, 2, 3, 4, 5] >>> sq_nums = [] >>> for num in numbers: sq_nums.append(num**2) >>> sq_nums [1, 4, 9, 16, 25]
Эту задачу можно также решить с использованием List Comprehensions .
>>> sq_nums = [num**2 for num in numbers] >>> sq_nums [1, 4, 9, 16, 25]
Точно такой же результат получим, если воспользуемся функций map() .
>>> sq_nums = list(map(lambda x: x**2, numbers)) >>> sq_nums [1, 4, 9, 16, 25]
На первый взгляд такой подход может показаться сложнее предыдущего, но вся его мощь заключается в первом аргументе – функции, которая используется для модификации значений элементов объекта. Это может быть как lambda -функция, как в нашем примере, так функция, созданная с использованием ключевого слова def .
Результат работы функции map() можно использовать в цикле for .
>>> msg = "simple" >>> for sym in map(lambda x: x+'-', msg): print(sym, end='') s-i-m-p-l-e-
Используйте map() , если вам необходимо обработать элементы объекта, используя определенную функцию .
Функция zip
Функция zip() позволяет в одном цикле for производить параллельную обработку данных. Это очень мощный инструмент! Zip принимает в качестве аргументов объекты, элементы которых будут объединены в кортежи, полученную структуру можно превратить в список кортежей, если это необходимо.
Решим следующую задачу, демонстрирующую возможности zip() : в нашем распоряжении есть два списка, построим третий, каждый элемент которого будет формироваться как сумма элемента из первого списка и элемента из второго, умноженного на два.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> c = [] >>> for (x, y) in zip(a, b): c.append(x + 2 * y) >>> c [5, 11, 17, 23, 29]
Результат объединения списков с помощью функции zip() представлен ниже. Элементы исходных списков группируются попарно, образуя кортежи.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> list(zip(a, b)) [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
Если в функцию zip() передать три списка, то получим кортежи, состоящие из трех элементов.
>>> a = [1, 3, 5, 7, 9] >>> b = [2, 4, 6, 8, 10] >>> c = [10, 11, 12, 13, 14] >>> list(zip(a, b, c)) [(1, 2, 10), (3, 4, 11), (5, 6, 12), (7, 8, 13), (9, 10, 14)]
В случае, когда исходные списки имеют разную длину, итоговое количество кортежей будет равно числу элементов в самом коротком списке.
>>> a = [1, 3, 5, 7, 9] >>> d = [20, 21] >>> list(zip(a, d)) [(1, 20), (3, 21)]
С помощью функции zip() можно создавать словари.
>>> a = [1, 3, 5, 7, 9] >>> keys = ['a', 'b', 'c', 'd', 'e'] >>> dict(zip(keys, a))
Используйте zip() для параллельной обработки данных и быстрого построения структур данных. Такое решение будет функциональным и лаконичным!
Как в python в цикле for задать шаг 0.5?
for _ in range(1,10,0.5):
TypeError: 'float' object cannot be interpreted as an integer
ты бы сам проверил прежде чем писать. но не работает цикл с числом типа float!
у тебя шаг от 1 до 10 идет. а что такое пол шага? то есть вместо 10 шагов ты сделаешь 20 полушагов. смысл думаю понятен? я так понимаю чел нужно чтоб какое то действие выполнялось только за 2 прохода цикла вот он и выразился как 0.5 шаг. так тут условие в помошь.
Как заставить функцию range работать с float в python?
Есть арифметическая функция понимающия переменные в integer, мне нужно написать скрипт который сможет принимать float в качестве step size для данной функции. Как можно это реализовать?
x = int(raw_input("Enetr your value for the first X: ")) y = int(raw_input("Enter your value for the last X: ")) z = int(raw_input("Enter step size wanted: ")) def function(x): return x**2 +4 * x-4 for i in xrange(x,y,z): print "f(<>) = <>".format(i, function(i))
- Вопрос задан более трёх лет назад
- 9983 просмотра
Комментировать
Решения вопроса 1
data scientist
Как вариант - модуль numpy.
import numpy as np x=np.arange(0.01,1.00,0.01) #x=array([ 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09. 1.00])
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2
Люблю сгущенку и функциональное программирование
Если float должен быть только шаг, то достаточно взять шаг равный 1 и умножать его на требуемый шаг
for i in xrange(x,y): i *= z print "f(<>) = <>".format(i, function(i))
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Backend developer (Python, Golang)
def frange(end, start=0.0, step=0.1): i = start while i < end: yield i i += step
Ответ написан более трёх лет назад
