Обсуждение:Программирование и научные вычисления на языке Python

Материал из Викиверситета
Перейти к навигации Перейти к поиску
Bible scroll template.svg
Вопросы обучаемых

Здесь Вы можете задать любые вопросы в соответствии с темой факультета/кафедры. Преподаватели постараются дать вам ответ. Интересные и познавательные дискуссии впоследствии могут быть вынесены отдельно.


Пожалуйста, добавляйте новые темы сверху.

Вы не даёте описания "что, как и почему", просто пример кода и всё. Пришёл через поисковики, думал толковое объяснение как работать с urllib. А оказалось зря потратил время. 88.154.123.66 14:26, 18 июля 2013 (UTC)

Целочисленное деление[править]

Извините за беспокойство, уважаемый LeoMat!

Но быть может Вы подскажете мне, Michael-13, начинающему изучать Python, как сократить программный код и одновременно избежать ошибок в вычислениях и их представлении программой? Дело в том, что при использовании символа "/" Python производит целочисленное деление. А дописывать ко всем целым числам точку и ноль: "1 -> 1.0" трудоемко, к тому же всегда есть шанс забыть это сделать. Существует ли способ избежать ошибки и излишней работы? Например путем написания строчки что-то вроде "all .1f", чтобы всем числам присвоить тип float с одним десятичным знаком после запятой. Или изменить функцию "/" с целочисленного на математическое деление: т.е. "/ = / + остаток".(К тому же, часто Python представляет числа в двоичном виде: 2.99999999.., а когда на экран выводится список из нескольких чисел, то он занимает несколько строк, вместо положенной одной. Дописывать форматирование к каждой функции - дело трудоемкое). Надеюсь, Вас не затруднит ответить на мой вопрос здесь же.

Заранее спасибо. Michael-13.

  • Конечно, такой способ есть. Язык развивается, и стало ясно, что для тех, кто только начинает программировать, более естественным будет полное соответствие обычным математическим операциям, в том числе и делению, поэтому в версии 3.0 обычному делению соответствует символ /, а целочисленному //. Для того, чтобы сделать то же самое в Python 2.6, следует просто импортировать такую возможность:


>>> from __future__ import division
>>> 7/5
1.3999999999999999
>>> 7//5
1
>>> print 7/5  # выведет результат вполне рационально
1.4


Надеюсь, я ответил на ваш вопрос. LeoMat 10:18, 31 мая 2010 (UTC)


  • Спасибо, что Вы нашли время ответить на мой вопрос, LeoMat!

Однако, в основном, приходится работать со списками, а с ними происходит нерациональное деление:

>>> from __future__ import division
>>> print [1/3, 2/3, 5/3]
[0.33333333333333331, 0.66666666666666663, 1.6666666666666667]

Как по умолчанию присвоить всем числам значение с одним десятичным знаком - вопрос остается открытым. Приходится тратить время на различные хитрости -

# -*- coding: cp1251 -*-
from __future__ import division
#print [4/5] #Не рационально

print (4/5) #Рационально

a=4 
b=5
f=a/b
print f #Рационально

def c(a,b): 
          c=a/b
          #return c #1.Не рационально
          print c #2.Рационально

Искренне надеюсь на Вашу помощь в вопросе представления значения чисел по умолчанию с одним десятичным знаком и, в частности, рационального представления списков.

С уважением, Michael-13. 18:07, 31 мая 2010


  • Я не знаю, зачем именно вам нужен вывод именно списков, поэтому отвечать мне довольно сложно. Тот пример, что вы предлагаете, показывает как осуществляется представление дробей с периодом в компьютере. Представление это довольно точно - ошибка обнаруживается всего лишь в 17 знаке после запятой, уменьшение числа знаков уменьшает точность. Если вам просто требуется вывести числа списка с заданной точностью, то конструкция довольна проста и вы можете изменять ее как угодно:


>>> from __future__ import division
>>> a = [1/3, 2/3, 5/3]
>>> for i in a: print '%.1f' % i,

0.3 0.7 1.7


Или можно создавать список строк следующим образом через генерацию:


>>> b = [format(i, '.1f') for i in a]
>>> print b
['0.3', '0.7', '1.7']


Возможны и другие реализации, но непонятно зачем выводить собственно список. Обычно со списком и работают, а выводятся уже результаты — числа в отформатированном виде.

  • Благодарю Вас, LeoMat.

С уважением, Michael-13. 11:23, 1 июня 2010.

Sage[править]

А про Sage что-нибудь будет? Kolas 17:49, 1 апреля 2010 (UTC)

  • Я лично не очень рад этому проекту. LeoMat 12:09, 2 апреля 2010 (UTC)

a po4emu ne rad? klassniy proekt, a kto avtor etih urokov?

  • Из-за того, что под Windows приходится ставить virtualbox, да и сам он весит порядочно. Хотя сам я дома чаще использую Ubuntu, но с тем, чтобы показывать тогда наработки, возникнут проблемы. Наверняка я слишком недооцениваю и уже думаю получше разобраться. Автор уроков — я. LeoMat 15:13, 3 апреля 2010 (UTC)
    • Sage пока вообще не очень дружелюбный к пользователям, впрочем как и Ubuntu (последняя не стоит на месте, но в консоль-то лазить еще приходится). Сам помучился устанавливая его - решение было простое, но в туториалах четко и единообразно не прописанное. Но проект многообещающий. Kolas 12:36, 11 апреля 2010 (UTC)

Связывание python и fortran/c/c++: f2py и swig[править]

Здравствуйте.

Будет ли урок на тему связывания python'а и fortran'а (f2py) или C/C++ (swig)? Могу помочь с написанием подобного урока.

95.79.144.137 03:59, 7 июня 2010 (UTC) Pavel
  • Спасибо. Думаю, эта тема будет очень интересна. LeoMat 16:51, 7 июня 2010 (UTC)

Двойной линк на pyweb.ru внизу странички[править]

Не знаю где оставить комментарий...

Собственно внизу страницы имеется двойной линк на один и тот же ресурс с разным описанием

Исправьте пожалуйста :)

217.118.91.89 11:20, 23 октября 2011 (UTC)Артем