en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 421
Subscribers
+124 hours
No data7 days
No data30 days
Posts Archive
ToCode
1 421
# 砖讬诪讜砖 讞讜讝专 讘拽讜讚 驻讬讬转讜谉 讘讗诪爪注讜转 Decorator 讛砖讘讜注 讘砖讬注讜专 砖讘讻诇诇 诇讗 讚讬讘专 注诇 Decorators 讬爪讗 诇讬 诇讻转讜讘 注诐 讛转诇诪讬讚讬诐 拽讜讚 注讘讜专 诪驻注谞讞 砖拽讜专讗 讛讜专讗讜转 诪拽诇讟 讞讬爪讜谞讬 讜诪讘爪注 讗讜转谉 诇驻讬 讛住讚专. 讛诪驻注谞讞 砖诇谞讜 讛讞讝讬拽 "讝讬讻专讜谉" 讜讻诇 讛讜专讗讛 讬讻诇讛 诇拽讘诇 驻专诪讟专 诪住驻专讬 讗讜 驻专诪讟专 砖讛讜讗 讗讜转, 讻讗砖专 讗诐 拽讬讘诇谞讜 讗讜转 讛讬讬谞讜 爪专讬讻讬诐 诇拽专讜讗 讗转 讛注专讱 砖诪转讗讬诐 诇讗讜转 讝讜 诪讛讝讬讻专讜谉. 诇讚讜讙诪讗 讛诪驻注谞讞 转讜诪讱 讘驻注讜诇转 set 砖砖讜诪专转 注专讱 诇讝讬讻专讜谉. 讗驻砖专讜转 讗讞转 讛讬讗 诇讛注讘讬专 诇 set 诪住驻专:
set a 10
讜讗讝 讘转讗 a 讘讝讬讻专讜谉 谞砖诪讜专 讗转 讛诪住驻专 10. 讗驻砖专讜转 砖谞讬讛 讛讬讗 诇讛注讘讬专 诇 set 讗讜转 讜讗讝 谞爪讟专讱 诇拽专讜讗 诪讛讝讬讻专讜谉 讗转 讛注专讱 讘转讗 讛诪转讗讬诐, 诇讚讜讙诪讗:
set a 10
set b a
讬砖诪讜专 讘转讗 a 讗转 讛注专讱 10 讜讘转讗 b 讗转 讛注专讱 砖砖诪讜专 注讻砖讬讜 讘 a, 讻诇讜诪专 讙诐 10. 讘拽讬爪讜专 讬爪讗 砖讻转讘谞讜 拽讜讚 注诐 讗诇诪谞讟 讞讝专转讬 砖谞专讗讛 讘注专讱 讻讱:
class MyParser:
    # ...
    def set(self, reg, val):
        ival = self.read_register_or_value(val)
        self.memory[reg] = val

    def sub(self, reg, val):
        ival = self.read_register_or_value(val)
        self.memory[reg] -= ival

    def mul(self, reg, val):
        ival = self.read_register_or_value(val)
        self.memory[reg] *= ival
讻诇 驻讜谞拽爪讬讛 诪砖转诪砖转 讘驻讜谞拽爪讬讬转 注讝专 讻讚讬 诇讘讚讜拽 讗诐 讛注专讱 砖拽讬讘诇讛 讛讜讗 诪住驻专 讗讜 讗讜转, 讜讗诐 讗讜转 讗讝 诇拽专讜讗 诪讛讝讬讻专讜谉 讗转 讛注专讱 讛诪转讗讬诐. 讛拽讜讚 注讜讘讚 讜讛砖讬诪讜砖 讛讞讜讝专 讘驻讜谞拽爪讬讬转 讛注讝专 讘讗诪转 诪砖驻专 讗转 讛诪爪讘 讘讛砖讜讜讗讛 诇讻转讬讘转 讛诇讜讙讬拽讛 讛诪诇讗讛 砖诇讜砖 驻注诪讬诐 讗讘诇 注讚讬讬谉 诪砖讛讜 讻讗谉 爪讜专诐: 讻诇 驻讜谞拽爪讬讛 爪专讬讻讛 诇讛讙讚讬专 诪砖转谞讛 讞讚砖 诪讛 砖诪讘讝讘讝 诇谞讜 砖诐, 讜讛诪讘谞讛 砖诇 砖讜专讛 专讗砖讜谞讛 讘驻讜谞拽爪讬讛 砖诪讜拽讚砖转 诇讛讻谞转 讛诪砖转谞讬诐 注诇讜诇 诇砖注诪诐 讻砖专讜讗讬诐 讗讜转讜 砖讜讘 讜砖讜讘. 讚专讱 讗讞转 诇讛驻讜讱 讗转 讛拽讜讚 诇拽爪转 讬讜转专 谞注讬诐 诇注讬谉 讛讬讗 诇讛诪讬专 讗转 讛拽专讬讗讛 讛讬讝讜诪讛 讘拽专讬讗讛 诇 Decorator:
class MyParser:
    @read_value_from_register
    def set(self, reg, val):
        self.memory[reg] = val

    @read_value_from_register
    def sub(self, reg, val):
        self.memory[reg] -= val

    @read_value_from_register
    def mul(self, reg, val):
        self.memory[reg] *= val
讻诇 诪讛 砖爪专讬讱 讘砖讘讬诇 讛诪注讘专 诇诪讘谞讛 讛讞讚砖 讛讜讗 诇讛讙讚讬专 讗转 讛驻讜谞拽爪讬讛 read_value_from_register 诪讞讜抓 诇诪讞诇拽讛 讘转讜专 Decorator:
def read_value_from_register(f):
    def inner(self, reg, val):
        ival = self.read_register_or_value(val)
        f(self, reg, ival)

    return inner
诪注谞讬讬谉 诇砖讬诐 诇讘 砖讘诪拽专讛 讻讝讛 讛驻讜谞拽爪讬讛 f 砖注讜讘专转 讻驻专诪讟专 讛讬讗 注讚讬讬谉 诇讗 Object Method 讗诇讗 驻讜谞拽爪讬讛 驻砖讜讟讛. 讛讬讗 注讚讬讬谉 诇讗 拽砖讜专讛 诇讗讜讘讬拽讟 诪讗讞专 讜讛 Decorator 谞拽专讗 诇驻谞讬 砖谞讜爪专讜 讗讜讘讬拽讟讬诐 诪住讜讙 MyParser. 诪住讬讘讛 讝讜 讘讛驻注诇转 讛驻讜谞拽爪讬讛 讗谞讞谞讜 讞讬讬讘讬诐 诇讛注讘讬专 讗转 self 讘爪讜专讛 讬讝讜诪讛 讘转讜专 讛驻专诪讟专 讛专讗砖讜谉. 诪诇讘讚 转砖讜诪转 讛诇讘 讛诪讬讜讞讚转 诇 self, 讛讙讚专转 Decorator 诇诪转讜讚讛 (砖谞诪爪讗转 讘转讜讱 诪讞诇拽讛) 讝讛讛 诇讞诇讜讟讬谉 诇讛讙讚专转 Decorator 诇驻讜谞拽爪讬讛 专讙讬诇讛.

ToCode
1 421
# 砖诇讜砖 讚讜讙诪讗讜转 拽讟谞讜转 诇注讘讜讚讛 注诐 讘住讬住讬 谞转讜谞讬诐 讘驻讬讬转讜谉 讘驻讬讬转讜谉 PEP 249 诪讗驻讬讬谉 讗转 讛诪诪砖拽 讛专爪讜讬 诇讚专讬讬讘专讬诐 诇讘住讬住讬 讛谞转讜谞讬诐 讛砖讜谞讬诐 讘驻讬讬转讜谉. 讘讜讗讜 谞专讗讛 3 讚讜讙诪讗讜转 诇注讘讜讚讛 注诐 讘住讬住 谞转讜谞讬诐 SQLite 讻讚讬 诇拽讘诇 诪讜砖讙 讗讬讱 讛诪诪砖拽 讛讝讛 谞专讗讛. ## 讬爪讬专转 讘住讬住 谞转讜谞讬诐 讜讟讘诇讗讜转 讛转讜讻谞讬转 讛专讗砖讜谞讛 讬讜爪专转 讘住讬住 谞转讜谞讬诐 诪住讜讙 SQLite 讜讘转讜讻讜 讬讜爪专转 砖转讬 讟讘诇讗讜转:
import sqlite3
conn = sqlite3.connect('example.db')

c = conn.cursor()

c.execute('CREATE TABLE people (name text, email text)')

c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')

conn.close()
讛驻拽讜讚讛 sqlite3.connect 诪转讞讘专转 诇讘住讬住 谞转讜谞讬诐 讜讛讬讗 讛驻拽讜讚讛 砖转讬专讗讛 砖讜谞讛 讘讬谉 讘住讬住讬 谞转讜谞讬诐 砖讜谞讬诐: 讘注讘讜讚讛 注诐 sqlite 讗谞讞谞讜 诪驻注讬诇讬诐 讗讜转讛 诪讛诪讜讚讜诇 砖诇 sqlite 讜诪注讘讬专讬诐 讗转 讛驻专诪讟专讬诐 砖专诇讜讜谞讟讬诐 诇诪讜讚讜诇 讝讛, 讜讘注讘讜讚讛 注诐 讘住讬住讬 谞转讜谞讬诐 讗讞专讬诐 谞注讘讬专 驻专诪讟专讬诐 讗讞专讬诐. 专讜讘 讛驻拽讜讚讜转 讛讗讞专讜转 讬注讘讚讜 讗讜转讜 讛讚讘专 讘讬谉 讘住讬住讬 谞转讜谞讬诐. 讛驻拽讜讚讛 cursor 讬讜爪专转 爪讬谞讜专 (谞拽专讗 cursor) 诇讘住讬住 讛谞转讜谞讬诐 讚专讻讜 讗驻砖专 诇讛专讬抓 砖讗讬诇转讜转, 诇讘爪注 驻注讜诇讜转 讜诇拽讘诇 讗转 讛转砖讜讘讜转 砖诇讛谉. 讘转讜讻谞讬转 讛驻注诇转讬 砖转讬 驻拽讜讚讜转 讬爪讬专转 讟讘诇讗 讘讗诪爪注讜转 execute 讜讘住讜祝 住讙专转讬 讗转 讛讞讬讘讜专. ## 讛讻谞住转 诪讬讚注 诇讘住讬住 讛谞转讜谞讬诐 讛转讜讻谞讬转 讛讘讗讛 诪讻谞讬住讛 砖诇讜砖 砖讜专讜转 诇讘住讬住 讛谞转讜谞讬诐 诇讟讘诇转 People:
import sqlite3
conn = sqlite3.connect('example.db')

c = conn.cursor()

# Larger example that inserts many records at a time
people = [
    ('one', 'one@gmail.com'),
    ('two', 'two@gmail.com'),
    ('three', 'three@gmail.com')
]

c.executemany("INSERT INTO people VALUES(?, ?)", people)
conn.commit()

c.close()
conn.close()
砖转讬 讛驻拽讜讚讜转 讛讞讚砖讜转 讘转讜讻谞讬转 讛谉 executemany 讜 commit. 讛驻拽讜讚讛 executemany 诪拽讘诇转 砖讗讬诇转讛 讜诪注专讱 砖诇 "注专讻讬诐 诇诪讬诇讜讬" 讜诪驻注讬诇讛 讗转 讛砖讗讬诇转讛 注诐 讻诇 讗讞讚 诪注专讻讬 讛诪讬诇讜讬 诪讛诪注专讱. 讗驻砖专 诇讛砖转诪砖 讙诐 讘 execute 讘砖讘讬诇 诇讛讻谞讬住 诪讬讚注 诇讘住讬住 讛谞转讜谞讬诐 讜讗讝 讘诪拽讜诐 诇讛注讘讬专 诪注专讱 谞注讘讬专 Tuple 讬讞讬讚 砖诇 注专讻讬 讛诪讬诇讜讬. 讛驻拽讜讚讛 commit 讛讬讗 砖砖讜诪专转 讘住讜祝 讗转 讛诪讬讚注 讜讞讬讬讘讬诐 诇拽专讜讗 诇讛 诇驻谞讬 砖住讜讙专讬诐 讗转 讛讞讬讘讜专. ## 砖诇讬驻转 诪讬讚注 诪讘住讬住 讛谞转讜谞讬诐 讛转讜讻谞讬转 讛砖诇讬砖讬转 砖讜诇驻转 讗转 讛诪讬讚注 讜驻砖讜讟 诪讚驻讬住讛 讗讜转讜 注诇 讛诪住讱:
import sqlite3
conn = sqlite3.connect('example.db')

c = conn.cursor()
name = 'one'
query = c.execute("SELECT * FROM people WHERE name = ?", (name,))
results = query.fetchall()
for row in results:
    print(row)

c.close()
conn.close()
讛驻拽讜讚讛 execute 讻诪讜 砖讻讘专 讛讘谞转诐 诪拽讘诇转 Tuple 注诐 注专讻讬诐 诇讛讞诇驻讛 (讘诪拽讜诐 讛住讬诪谉 砖讗诇讛), 讜讛驻拽讜讚讛 fetchall 诪驻注讬诇讛 讗转 讛砖讗讬诇转讛 讜诪讞讝讬专讛 诇谞讜 讗讜讘讬拽讟 转讜爪讗讜转. 讘注讝专转 讗讜讘讬拽讟 讛转讜爪讗讜转 谞讜讻诇 诇注讘讜专 砖讜专讛 砖讜专讛 注诇 讛转讜爪讗讜转 讜诇讛讚驻讬住 讻诇 讗讞转. 讘注讘讜讚讛 注诐 住讟讬诐 讙讚讜诇讬诐 砖诇 转讜爪讗讜转 讛专讘讛 驻注诪讬诐 谞专爪讛 诇讛砖转诪砖 讘 fetchmany 讜诇拽讘讜注 讗转 讙讜讚诇 讛诪谞讛. 讝讛 讬专讗讛 讻讱:
import sqlite3
conn = sqlite3.connect('example.db')

c = conn.cursor()
name = 'one'
query = c.execute("SELECT * FROM people")

while True:
    results = query.fetchmany(2)
    if len(results) == 0: break

    for row in results:
        print(row)

c.close()
conn.close()
诇住讬讻讜诐 驻讬讬转讜谉 诪住驻拽转 讞讬讘讜专 谞讜讞 讜讟讘注讬 诇讘住讬住讬 谞转讜谞讬诐 砖讜谞讬诐 讘诪诪砖拽 讗讞讬讚 砖诇讛专讘讛 转讜讻谞讬讜转 讬讛讬讛 诪住驻讬拽 讟讜讘. 诇驻专讟讬诐 谞讜住驻讬诐 砖讜讜讛 诇拽专讜讗 讗转 PEP 249 注爪诪讜 讗讜 讗转 讚祝 讛转讬注讜讚 注诇 讛诪讜讚讜诇 sqlite3 砖诪讙讬注 讬讞讚 注诐 驻讬讬转讜谉.

ToCode
1 421
# 驻专讬诇讗谞住专讬诐 讜讻诇讻诇转 讛讞诇讟讜专讛 讻讜诇诐 讘诪讚讬讛 讗讜讛讘讬诐 诇讚讘专 注诇 讛拽砖讬讬诐 讘讻诇讻诇讛 讛讞讚砖讛 讜讘驻专讟 讘转讞讜诐 砖谞拽专讗 "讻诇讻诇转 讛讞诇讟讜专讛". 讻诇讻诇转 讛讞诇讟讜专讛 讝讛 诪讜砖讙 砖诪转讗专 讗转 讛住讘讬讘讛 讛讻诇讻诇讬转 砖诪讞讘专转 讘讬谉 诇拽讜讞 诇谞讜转谉 砖讬专讜转 讘讗诪爪注讜转 讗驻诇讬拽爪讬讛 讗讜 驻诇讟驻讜专诪讛 诪专讻讝讬转, 讜讛讬讗 诪转讗驻讬讬谞转 讘讻讱 砖谞讜转谞讬 讛砖讬专讜转 诪拽讘诇讬诐 讬讞住 砖诇 "讘讜专讙 讘诪注专讻转" 砖讗驻砖专 转诪讬讚 诇讛讞诇讬驻讜 讘讗讞专. 讻讱 讻砖谞讝诪讬谉 诪讜谞讬转 讚专讱 Get Taxi 讗讬谉 诇谞讜 讚专讱 (讜讙诐 诇讗 诪诪砖 诪注谞讬讬谉 讗讜转谞讜) 诇讘讞讜专 诪讬 讬讛讬讛 讛谞讛讙 讘谞住讬注讛 讛讘讗讛 讜讘讗讜驻谉 讗讜讟讜诪讟讬 讛讗诇讙讜专讬转诐 诪讞讘专 诇谞讜 谞讛讙 砖专讜爪讛 讗转 讛谞住讬注讛 讜谞诪爪讗 讘讗讝讜专. 讻砖讗谞讞谞讜 诪讝诪讬谞讬诐 讗讜讻诇 诪-讜讜诇讟 诇讗 诪诪砖 诪注谞讬讬谉 讗讜转谞讜 诪讬 讛砖诇讬讞 讜讘讗讜驻谉 讗讜讟讜诪讟讬 讛讗诇讙讜专讬转诐 诪讞讘专 讗转 讛砖诇讬讞 诇谞住讬注讛. 讙诐 讘注住拽讬诐 讙讚讜诇讬诐 讬讜转专 讻诪讜 讞讬驻讜砖 驻专讬诇讗谞住专 讘 XPlace 讛专讘讛 驻注诪讬诐 讗谞讞谞讜 诪讞驻砖讬诐 驻专讬诇讗谞住专 注讘讜专 注讘讜讚讛 诪住讜讬诪转 讜讛讛注讚驻讛 砖诇谞讜 谞拽讘注转 诇驻讬 诪注专讻转 讛讚讬专讜讙讬诐 砖诇 讛驻诇讟驻讜专诪讛 讜讗诇讙讜专讬转诐 讛讞讬驻讜砖 砖诇讛. 讘爪讜专讛 讻讝讜 驻专讬诇讗谞住专讬诐 诪转拽砖讬诐 诇讘诇讜讟 讜诪拽讬讬诪讬诐 住讜讙 砖诇 诪讬专讜抓 诇转讞转讬转: 诪讬 讬讛讬讛 讛驻专讬诇讗谞住专 砖讬讬转谉 讗转 讛驻讬转专讜谉 讘诪讞讬专 讛谞诪讜讱 讘讬讜转专. 讜讛讘注讬讛 讘诪讬专讜抓 诇转讞转讬转 讛讬讗 砖讗转讛 注诇讜诇 诇谞爪讞, 讗讜 讬讜转专 讙专讜注 注诇讜诇 诇讛讙讬注 砖谞讬. 驻讬专住讜诪讬诐 专讘讬诐 讘注讬转讜谞讜转 诪讞讘专讬诐 讘讬谉 驻专讬诇讗谞住 诇讻诇讻诇转 讛讞诇讟讜专讛 讘讗讜驻谉 砖注诇讜诇 诇转转 诇拽讜专讗 讗转 讛专讜砖诐 砖讝讜 讛讚专讱 讛讬讞讬讚讛 讗讜 讛诪专讻讝讬转 诇讛转驻专谞住 讘转讜专 驻专讬诇讗谞住. 讛谞讛 讗讞讚 诪转讜讱 讙诇讜讘住: > 讘诪住讙专转 讻诇讻诇转 讛讞诇讟讜专讛, 讘拽专讜讘 诪讗讜讚, 诪专讘讬转 讛讗讜讻诇讜住讬讬讛 讛讻砖讬专讛 诇讛讬诪谞讜转 注诐 砖讜拽 讛注讘讜讚讛 讛诪讜讚专谞讬, 转拽讬讬诐 砖讜拽 砖讘专讜讘讜 诪讜砖转转 注诇 注讜讘讚讬诐 讝诪谞讬讬诐, 注讜讘讚讬诐 讘诪砖专讛 讞诇拽讬转 讗讜 注爪诪讗讬讬诐. 讜诪转讜讱 讚讛 诪专拽专: > "讻诇讻诇转 讛讞诇讟讜专讛" 砖爪讜讘专转 转讗讜爪讛 诪讗讝 讛诪砖讘专 讛注讜诇诪讬, 诪讘讜住住转 注诇 谞讜转谞讬 砖讬专讜转讬诐 砖讗讬谞诐 讝讜讻讬诐 诇拽讘诇 讗转 诪诇讜讗 讛讝讻讜讬讜转 讛转注住讜拽转讬讜转, 讻讱 砖诇讗 谞砖诪专讬诐 注拽专讜谞讜转 讬住讜讚 注诇讬讛诐 诪讜砖转转 诪砖驻讟 讛注讘讜讚讛 讛诪讙谉 讘讬砖专讗诇. 讻驻讜注诇 讬讜爪讗, 注砖讜讬讛 讻诇讻诇转 讛讞诇讟讜专讛 诇注专注专 讗转 讛讘讬讟讞讜谉 讛住讜爪讬讗诇讬 讜讛转注住讜拽转讬 砖诇 讗讜讻诇讜住讬讜转 砖诇讗 讛讬讜 讞砖讜驻讜转 诇住讬讻讜谞讬诐 讗诇讛 讘注讘专. 讜讻讱 诪转讻谞转讬诐 专讘讬诐 砖专讜爪讬诐 诇注讘讜专 诇讛讬讜转 驻专讬诇讗谞住专讬诐 讬转讞讬诇讜 讘驻转讬讞转 驻专讜驻讬诇 讘 XPlace, 讜讙诐 讗谞讬 讻砖专爪讬转讬 诇讛转讞讬诇 诇注讘讜讚 讻驻专讬诇讗谞住 讞讬驻砖转讬 注讘讜讚讛 讘转讜专 驻专讬诇讗谞住专 砖注讜讘讚 转讞转 转讬讜讜讱 砖诇 讞讘专转 讬讬注讜抓 讗讜 讞讘专转 讛讚专讻讛 讙讚讜诇讛. 讻砖讗谞讞谞讜 专拽 诪转讞讬诇讬诐 讛注讜诇诐 讛讗诪讬转讬 谞专讗讛 讙讚讜诇 讜诪诇讞讬抓 讜专讬砖讜诐 诇驻诇讟驻讜专诪讛 拽讬讬诪转 谞专讗讛 讻诪讜 讛讝讚诪谞讜转 讟讜讘讛 诇讛转讞讬诇 诇拽讘诇 注讘讜讚讜转. 讛讘注讬讛 讘注讘讜讚讛 注诐 驻诇讟驻讜专诪讜转 讛讬讗 砖讗谞讞谞讜 诪诪砖讬讻讬诐 诇讛专讜讜讬讞 诪讬讜诐 诇讬讜诐 讜诇讗讜专讱 讝诪谉 诇讗 讘讜谞讬诐 讗转 讛谞讻住讬诐 砖讬注讝专讜 诇谞讜 诇讛砖转驻专 讜诇讛转拽讚诐 讘转讜专 驻专讬诇讗谞住专讬诐. 讛讚专讱 讛讞讜爪讛 诪诪讬专讜抓 讛驻诇讟驻讜专诪讛 讛讬讗 诇讗 诇拽讘诇 讚讬专讜讙 讟讜讘 讬讜转专 讘驻诇讟驻讜专诪讛 - 讗诇讗 讛讬讗 诇讘谞讜转 讗转 讛谞讻住 讗讜 讛驻诇讟驻讜专诪讛 砖诇讻诐: 住驻专讬讬转 拽讜讚 驻转讜讞 驻讜驻讜诇专讬转 砖转讘讬讗 诇讻诐 诇拽讜讞讜转, 拽砖专讬诐 注诐 讘讻讬专讬诐 讘转注砖讬讛 砖住讜诪讻讬诐 注诇讬讻诐 讜讬砖诪讞讜 诇转转 诇讻诐 驻专讜讬拽讟讬诐 讗讬讻讜转讬讬诐, 诪讜爪专 转讜讻谞讛 砖诪讻谞讬住 诇讻诐 拽爪转 讻住祝 讜诪讘讬讗 讗讬转讜 讞砖讬驻讛 砖转注讝讜专 诇驻转讜讞 讚诇转讜转 讘注转讬讚. 讻讻诇 砖谞砖拽讬注 讬讜转专 讘讘谞讬讬转 谞讻住讬诐 讻讱 谞讜讻诇 诇拽爪讜专 讗转 讛驻讬专讜转 诇讗讜专讱 讝诪谉 讘砖讚讜转 砖诇谞讜.

ToCode
1 421
# 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 讜讗谞讗讙专诪讜转... 讗讜讬 讜讬讬 诇注讜诇诐 诇讗 讗砖讻讞 讗转 讛讛转专讙砖讜转 砖诇讬 讘讬讜诐 讛 4/12/2017 讻讗砖专 讘砖注讛 砖讘注 讘讘讜拽专 讗专讬拽 讜讜住讟诇 驻转讞 讗转 讛讞讬讚讛 讛专讘讬注讬转 砖诇 Advent Of Code 讗讜转讛 砖谞讛. 讛住讬讘讛 诇诪住讬讘讛 讛讬转讛 转讜讻谉 讛讞讬讚讛, 砖讘诪讘讟 专讗砖讜谉 谞专讗讛 诇讬 讻诪讜 讛讝讚诪谞讜转 谞驻诇讗讛 诇讻转讜讘 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 讜诇讛讬讻谞住 诇专砖讬诪转 讛驻讜转专讬诐 讛诪讛讬专讬诐 砖诇 讛转讞专讜转. 讛讞讬讚讛 谞砖诪注转 讘注专讱 讻讱 - 讘讛讬谞转谉 专砖讬诪转 砖讜专讜转 拽诇讟 住驻专讜 讻诪讛 砖讜专讜转 讗讬谞谉 讻讜诇诇讜转 诪讬诇讛 砖诪讜驻讬注讛 驻注诪讬讬诐. 注讻砖讬讜 讗谞讬 砖讜诪注 诪讬诇讛 砖诪讜驻讬注讛 驻注诪讬讬诐 讜讬砖专 诪讘讬谉 砖住讞讘拽 诪讚讘专 注诇 讛讘讬讟讜讬 讛专讙讜诇讗专讬:
\b(\w+)\b.*\b\1\b
砖讝讛 讘注讘专讬转 "转诪爪讗 诪讬诇讛, 砖诪讜专 讗讜转讛 讘爪讚, 转诪砖讬讱 拽讚讬诪讛 讜转讞驻砖 讗转 讗讜转讛 诪讬诇讛 砖讜讘". 砖讜专讜转 讛拽诇讟 砖诪转讗讬诪讜转 诇讘讬讟讜讬 讝讛 诪讻讬诇讜转 讗转 讗讜转讛 诪讬诇讛 驻注诪讬讬诐 讜讗谞讞谞讜 专拽 专讜爪讬诐 诇住驻讜专 讗转 砖讜专讜转 讛拽诇讟 砖诇讗 诪转讗讬诪讜转 诇讘讬讟讜讬. 讘驻讬讬转讜谉 讛拽讜讚 诇驻讬转专讜谉 讬专讗讛 讻讱:
import fileinput, re

count = 0

pat = re.compile(r'\b(\w+)\b.*\b\1\b')

with fileinput.input() as file:
    for line in file:
        if not pat.search(line):
            count += 1

print(count)
讝讛 诇拽讞 砖诇讜砖 讚拽讜转 诇讻转讜讘 讜讗谞讬 诪诪砖讬讱 讘专讬爪讛 诇讞诇拽 讛砖谞讬 砖诇 讛讞讬讚讛, 讜砖诐 - 讘讜诐. 诪住转讘专 砖注讻砖讬讜 讗专讬拽 专讜爪讛 砖谞住驻讜专 讻诪讛 诪讛砖讜专讜转 诇讗 讻讜诇诇讜转 砖转讬 诪讬诇讬诐 砖讛谉 讗谞讗讙专诪讛, 讻诇讜诪专 砖转讬 诪讬诇讬诐 砖诪讜专讻讘讜转 诪讗讜转谉 讗讜转讬讜转. 讜讘讗讜转讜 4 诇讚爪诪讘专 2017 讛专讙砖转讬 砖讗讬谉 住讬讻讜讬 诇讛讬讻谞住 诇专砖讬诪转 讛驻讜转专讬诐 讛诪讛讬专讬诐. 砖讛谞讛 讗谞讬 爪专讬讱 诇诪讞讜拽 讗转 讛讻诇 讜诇砖谞讜转 讙讬砖讛, 砖讛专讬 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 诇讗 讬讜讚注讬诐 诇讞驻砖 讗谞讗讙专诪讜转... 谞讻讜谉? 讝讛 诇拽讞 诇讬 讻诪讛 讬诪讬诐 诇讛讘讬谉 砖讗讬谉 住讬讘讛 诇诪讞讜拽 讗转 讻诇 讛拽讜讚 讜砖讗驻砖专 讘砖讬谞讜讬 诪诪砖 拽讟谉 讘转讜讻谞讬转 诇拽讘诇 讙诐 讗转 诪住驻专 讛砖讜专讜转 讘讛谉 讗讬谉 砖转讬 诪讬诇讬诐 砖讛谉 讗谞讗讙专诪讛 讗讞转 砖诇 讛砖谞讬讛. 讻诇 诪讛 砖爪专讬讱 诇注砖讜转 讝讛 诇住讚专 讗转 讛讗讜转讬讜转 讘讻诇 诪讬诇讛 诇驻讬 住讚专 讛讗诇祝-讘讬转 讻讱 砖讗诐 讘砖讜专讛 讛讬讛 讻转讜讘 讛诪砖驻讟:
dad can add
讗谞讞谞讜 谞砖谞讛 讗转 讛诪砖驻讟 诇:
add acn add
砖讬谞讜讬 讻讝讛 砖诇 讛讗讜转讬讜转 讘讻诇 诪讬诇讛 讬讗驻砖专 诇谞讜 诇讛砖转诪砖 砖讜讘 讘讘讬讟讜讬 讛专讙讜诇专讬 砖讻讘专 讻转讘谞讜. 讜讘讙诇诇 砖讗谞讞谞讜 讘驻讬讬转讜谉 讜诪讚讘专讬诐 注诇 讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 - 注讚讻讜谉 讛拽讜讚 讻讱 砖讬讞诇讬祝 讗转 住讚专 讛讗讜转讬讜转 讘讻诇 诪讬诇讛 讬讻讜诇 诇讛转讘爪注 讙诐 讛讜讗 讘讗诪爪注讜转 讘讬讟讜讬 专讙讜诇讗专讬, 讛驻注诐 注诐 讛讞诇驻讛:
import fileinput, re

count1 = 0
count2 = 0

pat = re.compile(r'\b(\w+)\b.*\b\1\b')

with fileinput.input() as file:
    for line in file:
        if not pat.search(line):
            count1 += 1

        line2 = re.sub(
                r'\b(\w+)\b',
                lambda m: ''.join(sorted(m.group(1))),
                line)

        if not pat.search(line2):
            count2 += 1

print(count1)
print(count2)
讗讙讘 转讞专讜讬讜转 讘诪拽讜专 讝讛 诇拽讞 诇讬 专讘注 砖注讛 诇讛讘讬谉, 诇驻转讜专 讜诇讛讙讬砖 讗转 讛讞诇拽 讛专讗砖讜谉 讜讗讞专讬讛 注讜讚 砖注讛 诇讛转讗讜砖砖 诪讛讛诇诐 砖诇 讛讞诇拽 讛砖谞讬 讜诇驻转讜专 讗讜转讜. 讛讞讘专'讛 讛专爪讬谞讬讬诐 砖诇 AoC 驻转专讜 讗转 砖谞讬 讛讞诇拽讬诐 转讜讱 讚拽讜转 讜专砖讬诪转 100 讛驻讜转专讬诐 讛专讗砖讜谞讬诐 谞住讙专讛 讗讞专讬 3 讚拽讜转 讜讗专讘注讬诐 砖谞讬讜转. 诪讝诇 砖讗谞讬 诪诪讬诇讗 诇讗 讟讬驻讜住 转讞专讜转讬. 讗讛 讜讻诪讜讘谉 注讜讚 砖讘讜注 讜讞爪讬 讬砖 住讬讚专转 讞讬讚讜转 讞讚砖讛 注诐 AoC 2019. 讗谞讬 讗谞住讛 诇注诪讜讚 讘拽爪讘 讜诇砖转祝 讞讬讚讜转 讜驻讬转专讜谞讜转 诪注谞讬讬谞讬诐 诪讛住讬讚专讛 讛讞讚砖讛 讘诪讛诇讱 讚爪诪讘专.

ToCode
1 421
# 砖注讛 讘讬讜诐 诇专讜讘 讛讗谞砖讬诐 拽诇 诇诪爪讜讗 5 讚拽讜转 讘讬讜诐, 注砖专 讘诇讞抓, 讗讘诇 砖注讛 讘讬讜诐!? 讝讛 讛诪讜谉. 拽诇 诇讬驻讜诇 诇诪诇讻讜讚转 讜诇讛住转讻诇 注诇 讗谞砖讬诐 砖讻谉 诪爪诇讬讞讬诐 诇讛砖拽讬注 讘讚讘专 讛讝讛 砖讗谞讞谞讜 专讜爪讬诐 讻讗讬诇讜 讗诐 专拽 讛讬讬转讬 讻诪讜讛诐 讛讬讬转讬 诪讜爪讗 讗转 讛讝诪谉- 专拽 讗谞砖讬诐 住驻讜专讟讬讘讬讬诐 诪爪诇讬讞讬诐 诇诪爪讜讗 讗转 讛讝诪谉 诇注砖讜转 讻讜砖专. 专拽 诪转讻谞转讬诐 砖注讜讘讚讬诐 讘讞讘专讜转 专爪讬谞讬讜转 诪爪诇讬讞讬诐 诇诪爪讜讗 讗转 讛讝诪谉 诇讻转讜讘 讘讚讬拽讜转 讬讞讬讚讛. 专拽 诇 CTO 讬砖 讝诪谉 诇诇诪讜讚 讟讻谞讜诇讜讙讬讜转 讞讚砖讜转 讻诇 讛讬讜诐. 专拽 讬讜注爪讬诐 讟讻谞讜诇讜讙讬讬诐 诪爪诇讬讞讬诐 诇诪爪讜讗 讝诪谉 诇讻转讜讘 讘诇讜讙 诪拽爪讜注讬. 讗讘诇 讛讗诪转 砖讬讜转专 诪讜注讬诇 诇讞砖讜讘 注诇 讝讛 讛驻讜讱: 讻砖讗爪诇讬讞 诇诪爪讜讗 讗转 讛讝诪谉 诇诇诪讜讚 砖注讛 讘讬讜诐 Python, 诇讗讜专讱 讝诪谉 讗驻转讞 讗转 讛专讗砖 诇砖讬讟讜转 注讘讜讚讛 讞讚砖讜转 讜讻讱 诇讗讜专讱 讝诪谉 讗讛讬讛 诪转讻谞转 讟讜讘 讬讜转专 讜转讛讬讛 诇讬 讬讜转专 讙诪讬砖讜转 诇讛诪砖讬讱 讜诇诇诪讜讚 讘讝诪谉 砖诇讬. 讜讗诐 讗转诐 诪讜讻谞讬诐 诇讛讗诪讬谉 诇讬 注诇 讝讛, 讻诇 诪讛 砖谞砖讗专 讘砖讘讬诇 诇讛讬讜转 讛讚讘专 砖讗转诐 专讜爪讬诐 诇讛讬讜转 讝讛 诇诪爪讜讗 讗转 讛砖注讛 讛讗讞转 讛讝讗转 讘讬讜诐.

ToCode
1 421
# 讘讜讗讜 谞诇诪讚 砖驻讛 讞讚砖讛 注诐 Python 讛讻讬 讻讬祝 诇砖诇讘 讘讬谉 讛讬讚注 砖诇讻诐 讘转讻谞讜转 诇讞讬讬诐 讛讗诪讬转讬讬诐 讜诇讻转讜讘 讻诇讬诐 拽讟谞讬诐 砖注讜讝专讬诐 讘讻诇 诪讬谞讬 诪砖讬诪讜转 砖诇 讛讬讜诐 讬讜诐. 讘驻讜住讟 讛讬讜诐 谞讻转讜讘 讻诇讬 拽讟谉 砖诇 讻专讟讬住讬讜转 诪讬诇讬诐 砖讬拽专讗 专砖讬诪转 讻专讟讬住讬讜转 诪讬诇讬诐 诪拽讜讘抓 讜讬讘拽砖 诪讗转谞讜 诇转专讙诐 诪讬诇讛 讘讬谉 砖转讬 砖驻讜转. 讘讚专讱 谞诇诪讚 讙诐 拽爪转 驻讬讬转讜谉. ## 诪讘谞讛 讛拽诇讟 拽讜讘抓 讻专讟讬住讬讜转 讛诪讬诇讬诐 爪专讬讱 诇讛讬讜转 驻砖讜讟. 讘注转讬讚 讗讜诇讬 讗驻讬诇讜 谞讬爪讜专 讗讞讚 讘讗讜驻谉 讗讜讟讜诪讟讬 注诐 讙讜讙诇 转专讙讜诐, 讗讘诇 讘讬谞转讬讬诐 驻砖讜讟 诇拽讞转讬 讻诪讛 诪讬诇讬诐 讘讗谞讙诇讬转 讜爪专驻转讬转 讜讬爪专转讬 诪讛谉 拽讜讘抓 讟拽住讟 砖谞专讗讛 讻讱:
mom / maman
dad / papa
hello / salut
island / 卯le
讘讙诇诇 砖讗谞讞谞讜 讘注住拽讬 讛砖驻讜转 讞砖讘转讬 砖讬讛讬讛 谞讞诪讚 诇爪讗转 诪注讜诇诐 讛 ascii 讜讘讙诇诇 讝讛 讛诪讬诇讛 "讗讬" 谞讻谞住讛 诇专砖讬诪讛. 讘讻诇 诪拽专讛 讗转诐 讬讻讜诇讬诐 诇砖讞拽 注诐 讝讛 讜诇讘讞讜专 讗转 讛诪讬诇讬诐 砖讗转诐 专讜爪讬诐 诇讛转讗诪谉 注诇讬讛谉 讘砖驻讛 砖讗转诐 诇讜诪讚讬诐. 讛住讬诪谉 / 讻讚讬 诇讛驻专讬讚 讘讬谉 讛诪讬诇讛 诇转专讙讜诐 砖诇讛 注讚讬祝 注诇 专讜讜讞 讻讬 诇驻注诪讬诐 谞专爪讛 诇讛转讗诪谉 注诇 转专讙讜诐 诪砖驻讟讬诐 砖诇 讻诪讛 诪讬诇讬诐. ## 拽专讬讗转 讛拽诇讟 诇诪讬诇讜谉 讘 Python 注诐 讛诪讜讚讜诇 fileinput 讗驻砖专 讬讛讬讛 诇拽专讜讗 讗转 讛拽诇讟 诇诪讬诇讜谉 讘讝讬讻专讜谉 讬讞住讬转 讘拽诇讜转 - 讛诪讜讚讜诇 讬讬转谉 诇谞讜 诇专讜抓 注诇 讻诇 讛砖讜专讜转 讘拽讜讘抓, 讜讘注讝专转 split 讗砖讘讜专 讻诇 砖讜专讛 诇诪讬诇讬诐 讘讗谞讙诇讬转 讜讘爪专驻转讬转. 讛讚讘专 讛讬讞讬讚 砖讞砖讜讘 诇讝讻讜专 讻讗谉 讛讜讗 诇拽专讜讗 诇 strip 讻讚讬 诇讗 诇讛讬转拽注 注诐 专讜讜讞讬诐 讘转讜讱 讛诪讬诇讛:
# Create the data
with fileinput.input("flashcards.txt") as f:
    for line in f:
        [english, french] = [w.strip() for w in line.split('/')]
        words[english] = french
## 讘讞讬专转 诪讬诇讛 讗拽专讗讬转 诪讛诪讬诇讜谉 注讻砖讬讜 砖讻诇 讛诪讬诇讬诐 讘讝讬讻专讜谉 讗驻砖专 诇讛诪砖讬讱 诇讘讞讜专 诪讬诇讛 讗拽专讗讬转 讘砖讘讬诇 讛诪砖讞拽 砖诇谞讜 - 讛驻讜谞拽爪讬讛 random.choice 诪讞讝讬专讛 讗诇诪谞讟 讗拽专讗讬 诪转讜讱 住讬讚专讛. 讛讘注讬讛 砖讛讬讗 诇讗 注讜讘讚转 注诇 诪讬诇讜谞讬诐 讜诇讻谉 注诇讬谞讜 诇拽讞转 讗转 word.items, 诇讛驻讜讱 讗讜转讜 诇专砖讬诪讛 讜讗讜转讛 诇砖诇讜讞 诇 random.choice. 讗谞讬 专讜爪讛 诇转诪讜讱 讙诐 讘转专讙讜诐 诪讗谞讙诇讬转 诇爪专驻转讬转 讜讙诐 诪爪专驻转讬转 诇讗谞讙诇讬转 诇讻谉 讗谞讬 诪讜住讬祝 注讜讚 诪砖转谞讛 讘讜诇讬讗谞讬 砖讬讙讚讬专 讗转 住讜讙 讛诪砖讞拽:
# Show a flashcard
word, translation = random.choice(list(words.items()))
reverse = random.choice([True, False])
if reverse:
    word, translation = translation, word
## 讛爪讙转 讛诪讬诇讛 讗讜转-讗讞专讬-讗讜转 讘讛诪转谞讛 诇转专讙讜诐 注讻砖讬讜 讗驻砖专 诇爪讗转 诇讚专讱 - 谞爪讬讙 讗转 讛诪讬诇讛 诇转专讙讜诐 讜谞讞讻讛 砖讛诪砖转诪砖 讬讻转讜讘 讗转 讛转专讙讜诐 砖诇讛. 讗诐 讛讜讗 讟注讛 谞爪讬讙 诇讜 讗讜转 讗讞转 诪讛诪讬诇讛 讻讚讬 诇讛讝讻讬专, 讘讟注讜转 讛讘讗讛 谞讜住讬祝 注讜讚 讗讜转 讜讻讱 注讚 砖谞爪讬讙 讘住讜祝 讗转 讻诇 讛诪讬诇讛. 讘讙诇诇 砖讻诇 驻注诐 讬砖 讛讝讚诪谞讜转 诇讛爪诇讬讞, 讗谞讬 讬讻讜诇 诇讛砖转诪砖 讘诪讘谞讛 谞讞诪讚 砖诇 Python 砖诇 else 注诇 诇讜诇讗讛: 讘诪讘谞讛 讻讝讛 讛 else 讬讜驻注诇 专拽 讗诐 诇讗 讛讬讛 break 讘转讜讱 讛诇讜诇讗讛, 讻诇讜诪专 专拽 讗诐 讛诪砖转诪砖 诇讗 讛爪诇讬讞 诇谞讞砖 讘爪讜专讛 谞讻讜谞讛 讗转 讛诪讬诇讛. 讛讞诇拽 讛讗讞专讜谉 砖诇 讛转讜讻谞讬转 诇讻谉 谞专讗讛 讻讱:
print(word)
for i in range(1, len(translation) + 1):
    guess = input('> ')
    if guess == translation:
        print('Bravo!')
        break

    print(translation[0:i])
else:
    print("Sorry, the answer was", translation)
讜讘驻讞讜转 诪-30 砖讜专讜转 拽讬讘诇转诐 诪砖讞拽 讝讬讻专讜谉 诇诪讬诇讬诐 砖讬注讝讜专 诇讻诐 诇诇诪讜讚 讻诇 砖驻讛 讘注讜诇诐.

ToCode
1 421
# 讝讛 注讜讚 专讞讜拽? 诇讬诪讜讚讬诐 诪住讜讚专讬诐 注讜讘讚讬诐 讘讙诇诇 砖讬砖 诇讛诐 诪谞讙谞讜谉 砖诇 讜讜讚讗讜转: 转住讬讬诐 讘讬转 住驻专 讘爪讬讜谞讬诐 讙讘讜讛讬诐 讜讬拽讞讜 讗讜转讱 诇讗讜谞讬讘专住讬讟讛; 转住讬讬诐 讗讜谞讬讘专住讬讟讛 讘爪讬讜谞讬诐 讙讘讜讛讬诐 讜讬转谞讜 诇讱 注讘讜讚讛; 诪讚注讬 讛诪讞砖讘 诇讜拽讞 砖诇讜砖 砖谞讬诐 诇诇诪讜讚, 讛谞讚住讛 讬讬拽讞 4 讜专驻讜讗讛 7. 讗诐 讗转 讘砖谞讛 砖谞讬讛 讘诪讚注讬 讛诪讞砖讘 讬砖 诇讱 注讜讚 砖谞讛 砖诇 诇讬诪讜讚讬诐 注讚 砖转诪爪讗讬 注讘讜讚讛. 讝讛 谞驻诇讗 讜讙讜专诐 诇讗谞砖讬诐 诇讛砖拽讬注. 讜讗谞讞谞讜 诪砖拽讬注讬诐 讗驻讬诇讜 砖讗谞讞谞讜 讬讜讚注讬诐 砖讝讛 诇讗 诪诪砖 注讜讘讚, 讗讜 诇讗 注讜讘讚 讬讜转专, 讗讜 诇讗 注讜讘讚 讻诪讜 讘住讬驻讜专讬诐 (讗讜 砖讗讜诇讬 讗祝 驻注诐 诇讗 注讘讚). 讗驻讬诇讜 砖讗谞讞谞讜 诪讻讬专讬诐 讛诪讜谉 讗谞砖讬诐 砖住讬讬诪讜 讗讜谞讬讘专住讬讟讛 讜诇讗 诪爪讗讜 注讘讜讚讛 讗讜 砖讛转拽砖讜 诇诪爪讜讗, 讜讗谞讬 诇讗 诪讚讘专 讘讻诇诇 注诇 住讬讜诐 砖诇 拽讜专住讬诐 诪拽爪讜注讬讬诐 讗讜 诪讻诇诇讜转 砖诐 讛讻诇 讗驻讬诇讜 讬讜转专 拽砖讛. 讻砖讗转讛 讘转讜讱 讛转讛诇讬讱 讛讜讜讚讗讜转 砖讛谞讛 注讜讚 讞爪讬 砖谞讛 谞讙诪专 讛拽讜专住 讗讜 注讜讚 砖谞讛 谞讙诪专 讛转讜讗专 讛讬讗 诪砖讛讜 砖讻讬祝 诇讛讬讗讞讝 讘讜, 讜讛讬讗 讙讜专诪转 诇讱 诇注讘讜讚 讬讜转专 拽砖讛 讜诇讛转诪讬讚. 讛诪注讘专 诇诇讬诪讜讚 注爪诪讬 讛讜讗 拽砖讛 讻讬 讘诇讬诪讜讚 注爪诪讬 讗祝 讗讞讚 诇讗 诪讘讟讬讞 诇讬 砖讜诐 讚讘专. 讗讜诇讬 讬讬拽讞 诇讬 讞讜讚砖 诇诇诪讜讚 驻讬讬转讜谉, 讗讜诇讬 讞讜讚砖讬讬诐 讜讗讜诇讬 砖谞讛. 讝讗转 转讞讜砖讛 砖拽砖讛 诪讗讜讚 诇讞讬讜转 讗讬转讛. 讜诇讻谉 讛诪驻转讞 诇讛爪诇讞讛 讘诇讬诪讜讚 注爪诪讬 谞拽专讗 讗诪讜谉. 诇讗 讗诪讜谉 讘诪注专讻转 (砖讘讬谞讬谞讜 诪爪诇讬讞讛 诇拽讬讬诐 专拽 讘诪拽专讬诐 谞讚讬专讬诐), 讗诇讗 讗诪讜谉 讘注爪诪讬. 讗诪讜谉 砖注讜讝专 诇讛讬专讙注 讜诇砖讬诐 讘爪讚 讗转 讛砖讗诇讜转 讻诪讜 "讝讛 注讜讚 专讞讜拽?", "诪转讬 讝讛 讬爪诇讬讞?", "诪转讬 讗诪爪讗 讻讘专 注讘讜讚讛?" 讗讜 "诪转讬 讗谞砖讬诐 讬转讞讬诇讜 诇拽谞讜转 讗转 讛诪讜爪专 砖诇讬?". 讻讬 讻诇 讛砖讗诇讜转 讛讗诇讛 诪住讬讞讜转 讗转 讛讚注转 诪讛讚讘专 讛讗诪讬转讬 砖爪专讬讱 诇注砖讜转 注讻砖讬讜 - 砖讝讛 诇讛诪砖讬讱 诇讻转讜讘 讜诇诪讞讜拽 拽讜讚 注讚 砖讛讜讗 讬注讘讜讚.

ToCode
1 421
# 讗讬讱 诇砖诪讜专 诪注专讱 讘住讟讬讬讟 砖诇 React Component 讗谞讞谞讜 讬讜讚注讬诐 砖 useState 诪拽讘诇 注专讱 专讗砖讜谞讬 砖诇 住讟讬讬讟 讜讗讞专讬 讝讛 讘讻诇 拽专讬讗讛 谞讜住驻转 诪讞讝讬专 讗转 讛注专讱 讛诪注讜讚讻谉 讘讬讜转专. 讛讘注讬讛 砖 useState 诪转谞讛讙 拽爪转 诪爪讞讬拽 讻砖砖讜诪专讬诐 讘讜 讚讘专讬诐 讻诪讜 诪注专讱 讗讜 讗讜讘讬拽讟, 讚讘专讬诐 砖讬讻讜诇讬诐 诇讛砖转谞讜转. 讘讜讗讜 谞专讗讛 诪讛 讛讘注讬讜转 讜讗讬讱 讘讻诇 讝讗转 诇砖诪讜专 诪注专讱 讘 State. ## 诇诪讛 砖谞专爪讛 诇砖诪讜专 诪注专讱 讘住讟讬讬讟 讛专讘讛 驻注诪讬诐 讗驻砖专 诇讛转讞诪拽 诪砖诪讬专转 诪注专讱 讜驻砖讜讟 诇砖诪讜专 讻诪讛 砖讚讜转 砖讜谞讬诐, 讗讘诇 讝讛 诇讗 转诪讬讚 讛讙讬讜谞讬. 讘讜讗讜 谞讬拽讞 讻讚讜讙诪讗 专砖讬诪讛 砖诇 讗诇诪谞讟讬诐 砖诪讗驻砖专转 诇讘讞讜专 讜诇住诪谉 拽讘讜爪讛 砖诇 讗诇诪谞讟讬诐 诪讛专砖讬诪讛. 讗讜诇讬 讗驻讬诇讜 讬讛讬讛 讻驻转讜专 砖诇 诪讞讬拽讛 讻讚讬 诇诪讞讜拽 讗转 讻诇 诪讛 砖讘讞专谞讜. 讘讻诇 诪拽专讛 讘砖诇讘 专讗砖讜谉 讗住转驻拽 讘专砖讬诪讛 砖转爪讬讙 诇讬 诇诪讟讛 讗讬讝讛 讗诇诪谞讟讬诐 谞讘讞专讜. 讛谞讛 谞拽讜讚转 讛讛转讞诇讛 注诐 驻拽讚 砖诪爪讬讙 专砖讬诪转 驻专讬讟讬诐 砖讗驻砖专 诇讘讞讜专 诪诪谞讛:
function SelectableList(props) {
  const { items } = props;
  return (
    <ul>
      {items.map(item => (
        <li key={item} style={{ direction: "rtl" }}>
          <label>
            {item}
            <input type="checkbox" />
          </label>
        </li>
      ))}
    </ul>
  );
}
讛专砖讬诪讛 注讜讘讚转 讜注讻砖讬讜 讗谞讬 专讜爪讛 诇讛讜住讬祝 诇诪讟讛 讗转 专砖讬诪转 讻诇 讛驻专讬讟讬诐 砖讘讞专谞讜. 驻讛 讛讞讬讬诐 诪转讞讬诇讬诐 诇讛住转讘讱. ## 讛讘注讬讛 注诐 砖诪讬专转 诪注专讱 讘住讟讬讬讟 谞讜住讬祝 诇住讟讬讬讟 诪注专讱 砖诇 讛驻专讬讟讬诐 砖谞讘讞专讜 讜谞注讚讻谉 讗转 讛诪注专讱 讻诇 驻注诐 砖诪砖转诪砖 讘讜讞专 讗讜 诪讘讟诇 讘讞讬专讛. 谞讬住讬讜谉 专讗砖讜谉 注砖讜讬 诇讛讬专讗讜转 讻讻讛 讗讘诇 讝讛 诇讗 注讜讘讚 讻诇诇: <iframe src="https://codesandbox.io/embed/zealous-rhodes-hjrdy?fontsize=14&hidenavigation=1&theme=dark" style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;" title="zealous-rhodes-hjrdy" allow="geolocation; microphone; camera; midi; vr; accelerometer; gyroscope; payment; ambient-light-sensor; encrypted-media; usb" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" ></iframe> 讛驻讜谞拽爪讬讛 selectItem 谞拽专讗转 讜诪注讚讻谞转 讗转 讛诪注专讱 - 讜讻讗谉 讘讚讬讜拽 讛讘注讬讛. 讗讞专讬 讛注讚讻讜谉 讗谞讞谞讜 拽讜专讗讬诐 诇 setSelectedItems 注诐 讗讜转讜 诪注专讱 讘讚讬讜拽. 讘诪讬诇讬诐 讗讞专讜转 诇诪专讜转 砖转讜讻谉 讛诪注专讱 讛砖转谞讛, 讗讜讘讬拽讟 讛诪注专讱 注爪诪讜 砖谞砖诪专 讘转讜讱 讛住讟讬讬讟 诇讗 讛砖转谞讛 讜诇讻谉 专讬讗拽讟 诪谞讬讞 砖诪讜转专 诇讚诇讙 注诇 讛 render 讛讝讛. ## 讗讬讱 讘讻诇 讝讗转 诇砖诪讜专 诪注专讱 讘住讟讬讬讟 讛诪住拽谞讛 砖讻讚讗讬 诇讛转讬讞住 诇诪讬讚注 砖讗谞讞谞讜 砖讜诪专讬诐 讘住讟讬讬讟 讘转讜专 Immutable 讻诇讜诪专 诪讬讚注 砖讗住讜专 诇砖谞讜转 讗转 讛转讜讻谉 砖诇讜 讜专拽 诇讛讞诇讬祝 讗讜转讜 讻砖爪专讬讱 诪砖讛讜 讞讚砖. 诪讞专讜讝讜转 讜诪住驻专讬诐 讛诐 讻讗诇讛 讘讗讜驻谉 讟讘注讬 讘 JavaScript, 讗讘诇 讘注讘讜讚讛 注诐 住讜讙讬 诪讬讚注 讗讞专讬诐 谞讚专砖转 讝讛讬专讜转 谞讜住驻转 讻讚讬 诇讗 诇砖谞讜转 讗讜转诐 讘讟注讜转. 诇诪讝诇谞讜 讘专讙注 砖讗谞讞谞讜 诪讘讬谞讬诐 讗转 讛讘注讬讛 拽诇 诪讗讜讚 诇转拽谉 讗讜转讛 - 驻砖讜讟 讬讜爪专讬诐 诪注专讱 讞讚砖 讘诪拽讜诐 诇注讚讻谉 讗转 讛拽讬讬诐 (讜讘讗讜驻谉 讻诇诇讬 转诪讬讚 谞讘讞专 诇讬爪讜专 讗讜讘讬拽讟 讞讚砖 讘诪拽讜诐 诇注讚讻谉 讗转 讛拽讬讬诐 讻砖诪讚讜讘专 讘诪砖转谞讬诐 砖砖诪讜专讬诐 讘住讟讬讬讟). 讘注讘讜讚讛 注诐 诪注专讻讬诐 讛驻讜谞拽爪讬讜转 concat 讜 filter 讬爪专讜 诪注专讱 讞讚砖, 讘注讜讚 讛驻讜谞拽爪讬讜转 splice 讜 push 讬注讚讻谞讜 讗转 讛拽讬讬诐. 讛谞讛 讛拽讜讚 讛诪注讜讚讻谉 注诐 concat 讜 filter: <iframe src="https://codesandbox.io/embed/amazing-euler-odg52?fontsize=14&hidenavigation=1&theme=dark" style="width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;" title="amazing-euler-odg52" allow="geolocation; microphone; camera; midi; vr; accelerometer; gyroscope; payment; ambient-light-sensor; encrypted-media; usb" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" ></iframe>

ToCode
1 421
# 讚讜讙诪转 专讬驻拽讟讜专讬谞讙 讘 React 注诐 Custom React Hook 讛住讬讘讛 讛诪专讻讝讬转 诇讚注转讬 诇注讘讜专 诇 React Hooks 讛讬讗 讛驻砖讟讜转 讘讛讜爪讗转 拽讜讚 诪砖讜转祝 诇驻讜谞拽爪讬讛 讞讬爪讜谞讬转 讜讘讬爪讜注 砖讬诪讜砖 讞讜讝专 讘拽讜讚 讘讬谉 驻拽讚讬诐 讗讜 讗驻讬诇讜 讘转讜讱 讗讜转讜 驻拽讚. 讻诇 驻讜谞拽爪讬讛 讬讻讜诇讛 诇讛驻注讬诇 驻讜谞拽爪讬讜转 Hook 讜诪住驻讬拽 诇讻转讜讘 驻讜谞拽爪讬讛 砖诪驻注讬诇讛 Hook-讬诐 讗讞专讬诐 讘砖讘讬诇 诇拽讘诇 Custom Hook. 讛讟专诪讬谞讜诇讜讙讬讛 讛诪住讜专讘诇转 讛讝讗转 讘讗讛 诇转转 砖诐 诇转讜驻注讛 诪讗讜讚 驻砖讜讟讛 砖讗讜诪专转 砖讻砖讬砖 诇谞讜 拽讜讚 诪砖讜转祝 讗谞讞谞讜 讬讻讜诇讬诐 诇讛讜爪讬讗 讗讜转讜 讛讞讜爪讛 诇驻讜谞拽爪讬讛. 讚讜讙诪转 讛专讬驻拽讟讜专讬谞讙 砖讗谞讬 专讜爪讛 诇讛专讗讜转 讛讬转讛 拽爪转 诪驻转讬注讛 诇讞诇拽 诪讛讗谞砖讬诐 讘拽讜专住 专讬讗拽讟 砖讗谞讬 诪注讘讬专. 讘讜讗讜 谞专讗讛 讗转 讛拽讜讚 拽讜讚诐 讻诇 诇驻谞讬 讛 Refactoring. 谞转讜谉 讛拽讜讚 讛讘讗 诇驻拽讚 砖诪砖转诪砖 讘-4 诪砖转谞讬诐 讘 State 讜注讜讚 砖谞讬 讗驻拽讟讬诐, 讜讛讻诇 讻讚讬 诇讟注讜谉 诪讬讚注 诪砖专转 讞讬爪讜谞讬:
import React from 'react';
import ReactDOM from 'react-dom';
import { useState, useEffect } from 'react';
import _ from 'lodash';
import $ from 'jquery';

const App = () => {
  const [id, setId] = useState(1);
  const [character, setCharacter] = useState({});
  const [filmId, setFilmId] = useState(1);
  const [film, setFilm] = useState({});

  useEffect(function() {
    setFilm({});
    const req = $.getJSON(`https://swapi.co/api/films/${filmId}/`, function(data) {
      setFilm(data);
    });
    return function cancel() {
      req.abort();
    }

  }, [filmId]);

  useEffect(function() {
    setCharacter({});
    const req = $.getJSON(`https://swapi.co/api/people/${id}/`, function(data) {
      setCharacter(data);
    });
    return function cancel() {
      req.abort();
    }
  }, [id]);

  const characterNameText = (character.name == null ?
    '[Loading please wait]' :
    character.name);

  const filmNameText = (film.title == null ?
    '[Loading please wait]' :
    film.title);

  const filmIds = (character.films != null ?
    character.films.map(f => f.match(/(\d+)\/$/)[1]) :
    _.range(1, 8));

  return (
    <div>
      <h1>ID: {id}</h1>
      Character ID:
      <select onChange={(e) => setId(e.target.value)}>
        {_.range(1, 11).map(id => (
          <option value={id}>{id}</option>
        ))}
      </select>
      Film ID :
      <select onChange={(e) => setFilmId(e.target.value)}>
        {filmIds.map(id => (
          <option value={id}>{id}</option>
        ))}
      </select>
      <hr />
      <h2>Character Name: {characterNameText}</h2>
      <h2>Film Name: {filmNameText}</h2>
    </div>
  )
};


const root = document.querySelector('main');
ReactDOM.render(<App />, root);
拽诇 诇专讗讜转 砖讛讙讚专转 讛讗驻拽讟 驻注诪讬讬诐 讛讬讗 讻驻讬诇讜转 诪讬讜转专转 - 注讘讜专 讻诇 讝讜讙 诪砖转谞讬诐 讘 State 讬砖 诇谞讜 讛讙讚专转 讗驻拽讟 砖诪讜驻注诇 讻砖讛诪砖转谞讛 ID 诪拽讘诇 注专讱 讞讚砖, 讜诪讻谞讬住 讗转 讛转讜讻谉 诇诪砖转谞讛 讛 Data. 讛驻拽讚 诪砖转诪砖 讘砖转讬 谞拽讜讚讜转 拽爪讛 讘 API 讜诇讻谉 讛讗驻拽讟 诪讜驻讬注 驻注诪讬讬诐 讜讗诐 讛讬讬谞讜 专讜爪讬诐 诇讛讜住讬祝 谞拽讜讚转 拽爪讛 谞讜住驻转 讛讬讬谞讜 爪专讬讻讬诐 诇砖讻驻诇 讗转 讛拽讜讚 驻注诐 砖诇讬砖讬转. 讗讬讱 诪转拽谞讬诐? 讻诇 诪讛 砖爪专讬讱 讛讜讗 诇讛讜爪讬讗 讗转 讛拽讜讚 讛讻驻讜诇 诇驻讜谞拽爪讬讛:
export function useRemoteData(endpoint) {
  const [id, setId] = useState(1);
  const [data, setData] = useState({});

  useEffect(function() {
    setData({});
    const req = $.getJSON(`https://swapi.co/api/${endpoint}/${id}/`, function(data) {
      setData(data);
    });
    return function cancel() {
      req.abort();
    }

  }, [id]);

  return [id, setId, data];
}
讜注讻砖讬讜 讗驻砖专 诇讛驻注讬诇 讗讜转讛 讘驻拽讚 讛专讗砖讬 砖诇谞讜 讘诪拽讜诐 讻诇 讛讘诇讗讙谉:
const App = () => {
  const [characterId, setCharacterId, character] = useRemoteData('people');
  const [filmId, setFilmId, film] = useRemoteData('films');
  // ...
讜讻谉 诇专讬讗拽讟 诪诪砖 诇讗 讗讻驻转 砖讗转诐 拽讜专讗讬诐 诪驻讜谞拽爪讬讬转 讛驻拽讚 诇驻讜谞拽爪讬讛 谞讜住驻转 讜讛讬讗 讝讜 砖拽讜专讗转 讘驻讜注诇 诇 useEffect 讜 useState. 诇诪注砖讛 讛讗驻砖专讜转 讛讝讜 诇讛讜爪讬讗 拽讜讚 讛讞讜爪讛 讛讬讗 讛住讬讘讛 讛诪专讻讝讬转 诇诪注讘专 诇 React Hooks. 讛驻讜谞拽爪讬讛 useRemoteData 谞拽专讗转 Custom Hook 讜讝讛 讻诇 诪讛 砖爪专讬讱 诇讚注转 讘砖讘讬诇 诇砖转祝 拽讜讚 诪讘讜住住 住讟讬讬讟 讘讬谉 拽讜诪驻讜谞谞讟讜转 砖讜谞讜转 讗讜 诇讘爪注 砖讬诪讜砖 讞讜讝专 讘拽讜讚 讻讝讛 讘转讜讱 讗讜转讛 拽讜诪驻讜谞谞讟讛.

ToCode - Statistics & analytics of Telegram channel @tocodeil