Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2018 23:56:00

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Вопросы от новичков.

 key=lambda item: (-item[1], item[0])
сортирую в порядке уменьшения по значению словаря, если значения одинаковы, сортирую по ключу в порядке возрастания (в данном случае в алфавитном порядке)

Офлайн

#2 Янв. 11, 2018 14:14:41

vl
Зарегистрирован: 2017-08-21
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Ребята помогите
Мне нужно ввести ОГРОМНЫЙ ТЕКСТ в переменную а потом вывести но интерплетатор начинает лагать как облегчить работу?(примерно 20000, но длинну текста мы не знаем(такова задача)))

Офлайн

#3 Янв. 11, 2018 22:57:11

Rusl
Зарегистрирован: 2017-10-23
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

В укусе питона есть пример.

 class SchoolMember:
    '''Представляет любого человека в школе.'''
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('(Создан SchoolMember: {0})'.format(self.name))
    def tell(self):
        '''Вывести информацию.'''
        print('Имя:"{0}" Возраст:"{1}"'.format(self.name, self.age), end=" ")
class Teacher(SchoolMember):
    '''Представляет преподавателя.'''
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print('(Создан Teacher: {0})'.format(self.name))
    def tell(self) -> object:
        SchoolMember.tell(self)
        print('Зарплата: "{0:d}"'.format(self.salary))
class Student(SchoolMember):
    '''Представляет студента.'''
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks
        print('(Создан Student: {0})'.format(self.name))
    def tell(self) -> object:
        SchoolMember.tell(self)
        print('Оценки: "{0:d}"'.format(self.marks))
        
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
print() # печатает пустую строку
members = [t, s]
for member in members:
    member.tell() # работает как для преподавателя, так и для студента

на выходе имеем:

Имя:“Mrs. Shrividya” Возраст:“40” Зарплата: “30000”
Имя:“Swaroop” Возраст:“25” Оценки: “75”

согласно пояснительной записке:

Заметьте также, что вызывается метод tell из подкласса, а не метод tell из
класса SchoolMember. Это можно понять следующим образом: Python всегда на-
чинает поиск методов в самом классе, что он и делает в данном случае. Если
же он не находит метода, он начинает искать методы, принадлежащие базо-
вым классам по очереди, в порядке, в котором они перечислены в кортеже при
определении класса.


В подклассах метод tell даёт на печать только Зарплата: "30000 и Оценки: "75
я так понимаю что сначала вызывается метод класса а потом подкласса что бы получилась строка

Имя:“Mrs. Shrividya” Возраст:“40” Зарплата: “30000”

Поясните новичку, как понимать правильно.



python: 3.6.6 64-bit
система: windows 10, 64-bit
редактор: PyCharm 2018.1.4 (Community Edition)

учебник: Изучаем Python. Программирование игр, визуализация данных, веб-приложения. Мэтиз Эрик.

Офлайн

#4 Янв. 12, 2018 03:58:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Ну правильно понимаете. Вы в отладчике походите и посмотрите что и в каком порядке происходит.



Офлайн

#5 Янв. 13, 2018 20:44:22

Timafei.sosnin
Зарегистрирован: 2017-09-13
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Помогите чайнику улучшить код пожалуйста.

 import random, json
def shift(lst,steps): 
    """ Циклический кольцевой сдвиг списка до минимума"""
    lst = lst[steps:] + lst[:steps]
    return lst
class Proteckt:#класс для шифровиния
    SimvolsKey= {}
    KeySimvols= ""
    text=0
    long=0
    ProtectText=""
    vingerPText=""
    
    def CreateKey(self,length=0,strr=0):#Создание ключа
        """
            Создание ключегово масива
        """
        if strr==0:
            strr="""АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя
                    1234567890 _-,.:;?/'"|\\(){}[]!@#$%^&*\n\t«»%
                    AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"""
        simvols=[]#масив символов
        mass=[]
        #собираю все символы
        for simvolsas in strr:
            if not(simvolsas in simvols):
                simvols.append(simvolsas)
                self.SimvolsKey.update({simvolsas:[]})
        if length==0:
            length=int(1324/3)
        else:
            length=int(length*123/300)
            if (length<3):
                length=3
        self.long=length
        for q in range(length):
            mass.append([])
            for sim in range(len(simvols)):
                while True:
                    r=random.randint(0,999)
                    if not(r in mass[q]):
                        mass[q].append(r)
                        break
        for w in mass:
            e=0
            for q in simvols:
                self.SimvolsKey[q].append(w[e])
                e=e+1                
    def saveKey(self,File):#Сохраняю ключь в файл
        File=File+".json"
        with open(File, 'w', encoding='utf-8') as fh:
            fh.write(json.dumps(self.SimvolsKey, ensure_ascii=False))
            
    def loadKey(self,File='Key.json'):#Загружаю из файла
        try:
            with open(File,'r', encoding='utf-8') as fh:
                self.SimvolsKey = json.load(fh)
        except FileNotFoundError:
            print("ключевой файл не найден")
            
    def code(self,strr=0):#Шифрование текста
        w=0
        e=0
        i=self.long
        if strr==0 and self.text!=0:
            for simvol in self.text:
                ProtectSimvol=self.SimvolsKey[simvol][e]
                if(w==0):
                    self.ProtectText+=str(ProtectSimvol)
                    w+=1
                else:
                    self.ProtectText+=" "+str(ProtectSimvol)
                e+=1
                if(e>=i):
                    e=0
                pass
        elif(strr!=0) and(type(strr)== str):
            pass
        else:
            print ("шибка текст отсутствует либо имеет не подходящий формат")
    def decode(self,strr=0):#Расшифровка текста
        q=''
        e=0
        ww=1
        strrq=''.join(self.SimvolsKey.keys())
        i=self.long
        if(strr==0):
            mass=self.ProtectText.split(" ")
            for Sim in mass:
                for q in strrq:                    
                    if (int(Sim) == self.SimvolsKey[q][e]):
                        ww=0
                        self.KeySimvols+=q
                if (ww==1):
                    self.KeySimvols+="\n"+Sim+"\n"
                e+=1
                if(e>=i):
                    e=0
                pass
            
    def codeFile(self,File_name):             
        fill=open(File_name,"r")
        fillProt=open(File_name+"11","w")
        e=0
        i=self.long
        for char in fill.read():
            fillProt.write(str(self.SimvolsKey[char][e])+' ')
            e+=1
            if(e>=i):
                e=0
        fill.close()
        fillProt.close()
        
    def decodeFile(self,File_name):
        fill=open(File_name)
        fillProt=open(File_name+"00","w")
        e=0
        i=self.long
        strr=''.join(self.SimvolsKey.keys())
        for char in fill.read():
            
            fillProt.write(str(self.SimvolsKey[char][e])+' ')
            e+=1
            if(e>=i):
                e=0
        fill.close()
        fillProt.close()
    def VingCodPText(self,key,strr=0):#шифрование защтщёного тексто на основе винжера
        if (len(self.ProtectText)<1):
            print("сначало зашифруйте текст при помощи функции класа code")
            return
        try:
            int(key)
        except ValueError:
            print("ключь может состоять тоолько из цифр")
            return
        vinjer={'1':['q','w','e','r','t','y','u','i','o','p','a'],
            '2':['q','w','e','r','t','y','u','i','o','p','a'],
            '3':['q','w','e','r','t','y','u','i','o','p','a'],
            '4':['q','w','e','r','t','y','u','i','o','p','a'],
            '5':['q','w','e','r','t','y','u','i','o','p','a'],
            '6':['q','w','e','r','t','y','u','i','o','p','a'],
            '7':['q','w','e','r','t','y','u','i','o','p','a'],
            '8':['q','w','e','r','t','y','u','i','o','p','a'],
            '9':['q','w','e','r','t','y','u','i','o','p','a'],
            '0':['q','w','e','r','t','y','u','i','o','p','a']}
        move=0
        simvol=0
        for ef in self.ProtectText:
            vinjer[key[simvol]]=shift(vinjer[key[simvol]],move)
            if ef==" ":
                move=5+int(key[simvol])
                self.vingerPText+=vinjer[key[simvol]][10]
            else:
                move=int(ef)+int(key[simvol])
                self.vingerPText+=vinjer[key[simvol]][int(ef)]
            if(move>7):
                move-=11
            simvol+=1
            if (simvol>len(key)-1):
                simvol=0
                
    def VingDecodVText(self,key,strr=0):
        
        if (len(self.vingerPText)<1):
            print("сначало зашифруйте текст при помощи функции класа VingCodPText")
            return
        try:
            int(key)
        except ValueError:
            print("ключь может состоять тоолько из цифр")
            return
        self.ProtectText=''
        move=0
        simvol=0
        vinjer={'1':['q','w','e','r','t','y','u','i','o','p','a'],
            '2':['q','w','e','r','t','y','u','i','o','p','a'],
            '3':['q','w','e','r','t','y','u','i','o','p','a'],
            '4':['q','w','e','r','t','y','u','i','o','p','a'],
            '5':['q','w','e','r','t','y','u','i','o','p','a'],
            '6':['q','w','e','r','t','y','u','i','o','p','a'],
            '7':['q','w','e','r','t','y','u','i','o','p','a'],
            '8':['q','w','e','r','t','y','u','i','o','p','a'],
            '9':['q','w','e','r','t','y','u','i','o','p','a'],
            '0':['q','w','e','r','t','y','u','i','o','p','a']}
        for sim in self.vingerPText:
            vinjer[key[simvol]]=shift(vinjer[key[simvol]],move)
            for er in range(11):
                if (vinjer[key[simvol]][er]==sim):
                    if (er==10):
                        move=5+int(key[simvol])
                        self.ProtectText+=" "
                    else:
                        move=er+int(key[simvol])
                        self.ProtectText+=str(er)
                    break
            if(move>7):
                move-=11
            simvol+=1
            if (simvol>len(key)-1):
                simvol=0
                        

Офлайн

#6 Янв. 14, 2018 05:42:10

Sancho
Зарегистрирован: 2017-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Всем привет.
Можете поделится простым примером хвостовой рекурсии. Только по проще - без лямбда функций, генераторов, классов. Простейший пример, что бы можно было код в отладчике погонять, а то не могу разобраться.

PS. Я только начал изучение Питона, по этому прошу самый простой пример.

Офлайн

#7 Янв. 14, 2018 06:51:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Sancho
Можете поделится простым примером хвостовой рекурсии.
Пример хвостовой рекурсии для функции факториала.

Хвостовая рекурсия
  
>>> def fact(n, acc=1):
...     if n < 2:
...         return acc
...     else:
...         return fact(n - 1, n * acc)
... 
>>> fact(5)
120
>>>

Не хвостовая рекурсия
  
>>> def fact(n):
...     if n < 2:
...         return 1
...     else:
...         return n * fact(n - 1)
... 
>>> fact(5)
120
>>>

В чём отличие: хвостовая рекурсия не требует полного разворачивания лестницы из вызовов функций; не хвостовая рекурсия разворачивает всю лестницу вызовов, иначе вычисления невозможны.

При хвостовой рекурсии можно полностью вычислить один вызов, стереть его и на его место записать следующий вызов, потом полностью вычислить, стереть его и на его место записать следующий вызов. Таким образом в функциональных языках можно делать вообще бесконечную рекурсию. И для этого используется аккумулятор, который и хранит промежуточные данные, накапливая их. Он же потом и возвращается в конце.

А при не хвостовой рекурсии делается вызов и вычислиться не может, потом делается вызов и вычислиться не может, потом делается вызов и вычислиться не может. Так происходит пока это всё не дойдёт до дна рекурсии, где произойдёт переключение на выходы, или пока память не закончится.

В питоне хвостовая рекурсия не оптимизируется. Но, может быть, какой-нибудь интерпретатор будет её оптимизировать и код при попадании в него сможет быть оптимизирован, и для этого его стоит делать в виде хвостовой рекурсии.



Тут важный момент: некоторые думают, что хвостовая рекурсия - это когда рекурсивный вызов в конце функции стоит; но здесь в том-то и фишка, что он может стоять в конце функции, но при этом всё равно всё разворачивать в полный рост. Поэтому не путай. Надо почуствовать, как работает функция в целом, есть ли у неё необходимость строить лестницу. Потому что лестницу оно никак не соптимизирует в один кадр.



Отредактировано py.user.next (Янв. 14, 2018 07:02:48)

Офлайн

#8 Янв. 14, 2018 07:18:43

Sancho
Зарегистрирован: 2017-12-17
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

py.user.next

То есть, в функции fact(n - 1, n * acc) я передаю вычисленные аргументы. И мне не нужно хранить предыдущие значения аргументов. Я правильно понял?
Значение на следующем цикле вызова вычисляются прямо в аргументах функции. Или есть ещё какой то подвох?
Но разве команда return не заставляет интерпретатор поместить вызов в стек в не зависимости от условия вызова?

Самое не понятное для меня почему интерпретатор при каждом новом вызове функции fact(n - 1, n * acc)
должен перезаписывать стек с вызовом функции а не записывать новый вызов в стек. То есть по чему стек не растёт. Смотря на пример хвостовой рекурсии я пониманию, что функции в принципе нечего возвращать - нет выражение которое, что либо бы делало с возвращаемым значение. И всё же это все равно вызов, так по чему стек не растёт?

Отредактировано Sancho (Янв. 14, 2018 07:31:38)

Офлайн

#9 Янв. 18, 2018 17:57:38

PewDeiNiro
Зарегистрирован: 2018-01-18
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

Как сделать так чтобы мой python код запускал другую программу а)Через командную строку; б)Не через командную строку;Помогите, пожалуйста это мне нужно для написания программы!

Офлайн

#10 Янв. 22, 2018 21:59:08

Laucnh10101
Зарегистрирован: 2017-05-17
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопросы от новичков.

В чем различия между модулями cx_Freeze, pyinstaller, cx_Freeze?
Какой модуль на данный момент считается оптимальным для python 3.6?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version