en
Feedback
ToCode

ToCode

Open in Telegram

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

Show more
1 418
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
ToCode
1 419
# 讞讝专讛 诇砖讬讙专讛 - 讜讜讘讬谞专讬诐 讻砖诪讙讬注 讛讞讜驻砖 讛讙讚讜诇 讻讜诇诐 讬讜讚注讬诐 砖讬砖 转讗专讬讱 住讬讜诐 砖谞拽专讗 1.9 讜讻砖讛讜讗 讬讙讬注 讗谞讞谞讜 谞讞讝讜专 诇砖讬讙专讛 诇驻讞讜转 注讚 讛讞讙讬诐. 讛讬爪讬讗讛 诪讛砖讬讙专讛 砖诇 讛拽讜专讜谞讛 讛讬转讛 砖讜谞讛: 驻注诐 专讗砖讜谞讛 讘讛专讘讛 讝诪谉 砖讗谞讞谞讜 讬讜爪讗讬诐 诪讛诪住诇讜诇 讘诇讬 转讗专讬讱 住讬讜诐. 讬讻讜诇 诇讛讬讜转 砖砖讘讜注 讛讘讗 讛讞爪讬-讙谉 砖讬砖 诇谞讜 讬讬诪砖讱, 讜讘讗讜转讛 诪讬讚讛 讬讬转讻谉 讜讛讜讗 砖讜讘 讬讬住讙专 诇讙诪专讬. 讜注讚讬讬谉 讘转讜讱 讻诇 讝讛 谞专讗讛 砖讛讞讬讬诐 讞讜讝专讬诐 诇砖讬讙专讛 诪讛讜住住转, 讜讛讙讬注 讛讝诪谉 砖讙诐 讗谞讞谞讜 谞讛诪专 讜谞讞讝讜专 诇砖讬讙专转 讛讜讜讘讬谞专讬诐 砖诇谞讜 讻讗谉 讘讗转专. 讘讛谞讞讛 讛讗讜驻讟讬诪讬转 砖讛讞爪讬-讙谉 讛讜诇讱 诇讛讬诪砖讱, 拽讘注转讬 讛讘讜拽专 砖谞讬 讜讜讘讬谞专讬诐 诇转拽讜驻讛 讛拽专讜讘讛: 讘讞诪讬砖讬 讛讘讗, 讛 21.5 谞讬驻讙砖 诇讚讘专 注诇 Github Actions 讜诇讛专讬诐 诪注专讻转 CI 诇讗驻诇讬拽爪讬讬转 讜讜讘 砖谞讻转讜讘. 讘注讝专转 讛讞砖讘讜谉 讛讞讬谞诪讬 砖诇 讙讬讟讛讗讘 谞专讗讛 讗讬讱 讗谞讞谞讜 诪专讬爪讬诐 讘爪讜专讛 讗讜讟讜诪讟讬转 讘讚讬拽讜转 讜诪注诇讬诐 讙讬专住讗 讜讛讻诇 讚专讱 讛 GUI 讛讬驻讛 砖诇 讙讬讟讛讗讘. 砖讘讜注讬讬诐 讗讞专 讻讱, 讘 4.6 讗注讘讬专 讻讗谉 讜讜讘讬谞专 注诇 Service Worker. 讝讛 API 诪讗讜讚 诪砖诪注讜转讬 讘 Web 砖讬砖 诇讜 转诪讬讻转 讚驻讚驻谞讬诐 专讞讘讛 讜讗转专讬诐 专讘讬诐 谞注讝专讬诐 讘讜 讻讚讬 诇讛爪讬注 转讜讻谉 Offline 讜诇砖驻专 讘讬爪讜注讬诐. 讗谞讞谞讜 谞专讗讛 2-3 讚讜讙诪讗讜转 诇讻转讬讘讛 讜注讘讜讚讛 注诐 Service Worker. 砖谞讬 讛讜讜讘讬谞专讬诐 讬转拽讬讬诪讜 讘注砖专 讘讘讜拽专 讘讝讜诐 讜讻诇 讗讞讚 诪讛诐 讬讬诪砖讱 拽爪转 驻讞讜转 诪砖注讛. 讚驻讬 讛讛专砖诪讛 诇讜讜讘讬谞专讬诐 讻讘专 诪讜讻谞讬诐 讜讗谞讬 诪拽讜讜讛 诇专讗讜转 讗转讻诐 砖诐: 专讬砖讜诐 诇讜讜讘讬谞专 Service Worker: https://www.tocode.co.il/workshops/98 专讬砖讜诐 诇讜讜讘讬谞专 Github Actions: https://www.tocode.co.il/workshops/97

ToCode
1 419
# 讛讞讚砖谞讜转 诪转讛. 讘专讜讱 砖驻讟专谞讜 注讚讬讬谉 诇讗 讘专讜专 讗讬讱 讛拽讜专讜谞讛 转砖驻讬注 诇讟讜讜讞 讛专讞讜拽 注诇 讛注住拽讬诐 砖诇谞讜, 讗讘诇 讚讬 讘讟讜讞 砖讛讬讗 诇讗 讛住讬讘讛 砖注讜诇诐 讛 Web 讜讛 Mobile 讛讙讬注 诇住讜讙 砖诇 讬爪讬讘讜转. 讘注讜诇诐 讛 Web 讛驻专讬讬诪讜讜专拽讬诐 讛诪专讻讝讬讬诐: React, Vue 讜 Angular 注讜诪讚讬诐 讻讜诇诐 注诇 拽专拽注 讬爪讬讘讛. 讘 React 讗讞专讬 讛讻谞讬住讛 砖诇 Hooks 讻诇 讛 API 讛转讬讬爪讘 讜讛讗拽讜住讬住讟诐 谞讘谞讬转 诇讗讟 诇讗讟 住讘讬讘 拽讜谞住驻讟 讝讛. 谞讻讜谉, 注讜讚 诪注讟 谞专讗讛 讗转 Concurrent Mode 讘驻专讜讚拽砖谉, 讗讘诇 讝讛 专讞讜拽 诪诇讛讬讜转 诪讛驻讻讛. 讗谞讙讜诇专 讻讘专 讘讙讬专住讗 9 讗讘诇 诪讗讝 讙讬专住讗 2 讗讬谉 砖讬谞讜讬讬诐 诪讛驻讻谞讬讬诐 讜 Vue3 讻讘专 讝诪讬谞讛 讘讙讬专住转 讘讟讗 讜讻谞专讗讛 转讬砖讗专 讗讬转谞讜 转拽讜驻讛 讗专讜讻讛. 讙诐 讘讚驻讚驻谞讬诐 注爪诪诐 诪讗讝 Service Worker 拽砖讛 诇讛讬讝讻专 讘驻讬爪'专 讞讚砖 讜诪讛驻讻谞讬 讜讘注讜诇诐 讛 CSS 讛转诪讬讻讛 讘 Flexbox 讜讙专讬讚 讻讘专 讬爪讬讘讛 讜诪讻住讛 讗转 专讜讘 讛专砖转. 讘注讜诇诐 讛 Mobile 诪注专讻转 讛驻注诇讛 讞讚砖讛 诇讟诇驻讜谞讬诐 诇讗 转讙讬注. 专讬讗拽讟 谞讬讬讟讬讘 注讚讬讬谉 注讜讘讚 讟讜讘 讜讻谞专讗讛 诪转讻谞转讬诐 讬诪砖讬讻讜 诇专讬讘 注讜讚 讝诪谉 专讘 讗诐 诇讘讞讜专 讘讜 讗讜 讘 Flutter, 讗讘诇 讝讛 讘讻诇诇 诇讗 讞砖讜讘. 讜讝讛 诪注讜诇讛. 讻讬 讝讛 讗讜诪专 砖讗诐 讗转诐 讞讜砖讘讬诐 注诇 注转讬讚 讛驻讬转讜讞 讗讞专讬 讛拽讜专讜谞讛, 讘注讜诇诐 讛 Web 讜讛 Mobile 讬砖 诇讻诐 讬讞住讬转 诪注讟 讟讻谞讜诇讜讙讬讜转 诇诇诪讜讚, 讜讗转 讛讝诪谉 诇诇诪讜讚 讗讜转谉 讻诪讜 砖爪专讬讱. 诪讬 砖讬诇诪讚 讛讬讜诐 专讬讗拽讟, 讗谞讙讜诇专 讗讜 Vue3 (讗讜 讗转 砖诇讜砖转诐) 讬拽讘诇 讻诇讬诐 砖讛讜诇讻讬诐 诇讛讬砖讗专 专诇讜讜谞讟讬诐 诇砖讜拽 转拽讜驻讛 讚讬 讗专讜讻讛. 讜诪讬 砖转转讞讬诇 诇驻转讞 诪注专讻转 讞讚砖讛 讛讬讜诐 讘讻诇 讗讞转 诪讛讟讻谞讜诇讜讙讬讜转 讛诪讜讘讬诇讜转 转拽讘诇 讘住讬讻讜讬 讙讘讜讛 转诪讬讻讛 讟讜讘讛 讜诪注专讻转 讗讜驻谞转讬转 讙诐 讘注讜讚 砖谞讛. 注讜砖讛 专讜砖诐 砖讛讞讚砖谞讜转 注砖转讛 讘专拽住 专爪讬谞讬 讘转拽讜驻讛 讛讗讞专讜谞讛. 诇讗 注讜讚 驻专讬讬诪讜讜专拽 讞讚砖 讻诇 讬讜诪讬讬诐 讜砖讻转讜讘 诪诇讗 砖诇 驻专讬讬诪讜讜专拽讬诐 驻注诐 讘砖讘讜注. 诇讗 注讜讚 注讬讚讻讜谞讬 讙讬专住讗 砖讘讜专讞讬诐 诪讛诪驻转讞讬诐. 住讜祝 住讜祝 讗驻砖专 诇注讘讜讚.

ToCode
1 419
# 诪讬讝讜讙 诪讬诇讜谞讬诐 诪拽讜谞谞讬诐 讘 Python 讞讘专 谞讬住讛 诇诪讝讙 诪住驻专 诪讬诇讜谞讬诐 讘爪讜专讛 诪拽讜谞谞转 讘 Python 讜拽爪转 讛住转讘讱 讗讝 讛讜讗 砖诇讞 诇讬 讗转 讛砖讗诇讛 讜讗谞讬 拽驻爪转讬 注诇 讛讛讝讚诪谞讜转 诇注谞讜转 讻讗谉 讘驻讜住讟. 讗砖诪讞 诇砖诪讜注 讙诐 讚注讜转 砖诇讻诐 注诇 讛驻讬转专讜谉 讗讜 专注讬讜谞讜转 诇讻讬讜讜谞讬诐 谞讜住驻讬诐. ## 诪讛 爪专讬讱? 谞专爪讛 诇讘谞讜转 驻讜谞拽爪讬讛 砖诪拽讘诇转 砖谞讬 诪讬诇讜谞讬诐 讜诪注转讬拽讛 讗转 讛诪讬诇讜谉 讛砖谞讬 诇转讜讱 讛专讗砖讜谉, 讗讘诇 讗诐 讬砖 讘砖谞讬 讛诪讬诇讜谞讬诐 诪驻转讞 讝讛讛 砖讛注专讱 砖诇讜 讛讜讗 诪讬诇讜谉 谞讜住祝, 讗讝 讛驻讜谞拽爪讬讛 转诪讝讙 讙诐 讗转 讛诪讬诇讜谞讬诐 讛驻谞讬诪讬讬诐 讜讻讱 讛诇讗讛 诇讻诇 注讜诪拽 砖讗驻砖专 诇讚诪讬讬谉. 讘讬讜诐 专讙讬诇 讛讬讬谞讜 讞讜砖讘讬诐 注诇 驻讬转专讜谉 专拽讜专住讬讘讬, 讗讘诇 讘讙诇诇 砖讗谞讞谞讜 讘驻讬讬转讜谉 讜讗讬谉 讗讜驻讟讬诪讬讝爪讬讛 诇专拽讜专住讬讜转 讝谞讘 讻讚讗讬 诇讜讜转专 注诇 讝讛 讻讚讬 砖讛转讜讻谞讬转 讘讗诪转 转讜讻诇 诇注讘讜讚 注诇 讻诇 注讜诪拽 诪讬诇讜谉 讜诇讗 转转专住拽 讻砖讛诪讞住谞讬转 转注诇讛 注诇 讙讚讜转讬讛. 讚讜讙诪转 砖讬诪讜砖 讘驻讜谞拽爪讬讛 讬讻讜诇讛 诇讛讬专讗讜转 讻讱:
d = dict()
update_dict_with_subdicts(d, {"a": 4})
assert d == {"a": 4}

new_dict = {
        "b": {
            "c": {
                "d": 6
                }
            }
        }
update_dict_with_subdicts(d, new_dict)
assert d == {
        "a": 4,
        "b": {
            "c": {
                "d": 6
                }
            }
        }
        
new_dict = {
        "a": 3,
        "b": {
            "f": 7
            }
        }
update_dict_with_subdicts(d, new_dict)
assert d == {
        "a": 3,
        "b": {
            "c": {
                "d": 6
                },
            "f": 7
            }
        }
## 驻讬转专讜谉 讘砖驻转 Python 讛讚专讱 讛讻讬 拽诇讛 诇讛讞诇讬祝 诪讬诪讜砖 专拽讜专住讬讘讬 讘诪讬诪讜砖 讗讬讟专讟讬讘讬 讛讬讗 诇讛讜住讬祝 诪讘谞讛 谞转讜谞讬诐 砖诇 诪讞住谞讬转. 讘 Python 诪讘谞讛 讛谞转讜谞讬诐 collections.deque 讬讻讜诇 诇砖诪砖 讘拽诇讜转 讘转讜专 诪讞住谞讬转 讗诐 谞砖转诪砖 讘驻讜谞拽爪讬讜转 popappend 诪讗讞专 讜砖转讬讛谉 注讜讘讚讜转 注诇 讗讜转讜 讛爪讚. 讛驻讜谞拽爪讬讛 append 诪讜住讬驻讛 讗讬讘专 诇爪讚 讛讬诪谞讬 砖诇 讛转讜专, 讜 pop 诪讜爪讬讗讛 讗转 讛讗讬讘专 讛讬诪谞讬 讘讬讜转专. 讘讙诇诇 砖讛驻讜谞拽爪讬讛 诪拽讘诇转 砖谞讬 驻专诪讟专讬诐 讗谞讬 驻砖讜讟 诪讞诇讬祝 讻诇 拽专讬讗讛 专拽讜专住讬讘讬转 讘讛讜住驻讛 砖诇 砖谞讬 讛驻专诪讟专讬诐 诇诪讞住谞讬转, 讜讗转 讛驻讜谞拽爪讬讛 讻讜诇讛 注讜讟祝 讘诪讘谞讛 砖诇 诇讜诇讗讛, 讻讱 砖讻诇 讗讬讟专爪讬讛 砖诇 讛诇讜诇讗讛 诪讞诇讬驻讛 "讬爪讬讗讛" 诪讛拽专讬讗讛 讛专拽讜专住讬讘讬转. 诪讘讞讬谞转 讛拽讜讚 讗谞讞谞讜 专讜爪讬诐 诇讘讚讜拽 讗转 住讜讙讬 讛注专讻讬诐 讘砖谞讬 讛爪讚讚讬诐 讜诇讞诇拽 讗转 讛驻讜谞拽爪讬讛 诇-5 诪爪讘讬诐: 1. 讗诐 诪驻转讞 诪住讜讬诐 谞诪爪讗 讘诪讬诇讜谉 讛砖谞讬 讗讱 诇讗 讘诪讬诇讜谉 讛专讗砖讜谉, 驻砖讜讟 诪注转讬拽讬诐 讗讜转讜. 2. 讗诐 诪驻转讞 谞诪爪讗 讘砖谞讬 讛诪讬诇讜谞讬诐, 讜讛注专讱 砖诇讜 讛讜讗 dict 讘砖谞讬讛诐 - 谞讜住讬祝 拽专讬讗讛 "专拽讜专住讬讘讬转" 诇诪讬讝讜讙 砖谞讬 讛注专讻讬诐. 3. 讗诐 诪驻转讞 谞诪爪讗 讘砖谞讬 讛诪讬诇讜谞讬诐, 讜讛注专讱 砖诇讜 讛讜讗 dict 专拽 讘砖谞讬, 注诇讬谞讜 诇讝专讜拽 讗转 讛注专讱 讛讬砖谉 诪讛专讗砖讜谉, 诇讛讞诇讬祝 讗讜转讜 讘诪讬诇讜谉 专讬拽 讜讗讝 诇讟驻诇 讻讗讬诇讜 讗谞讞谞讜 讘诪拽专讛 (2). 4. 讗诐 诪驻转讞 谞诪爪讗 讘砖谞讬 讛诪讬诇讜谞讬诐 讗讱 讘诪讬诇讜谉 讛砖谞讬 讛注专讱 讗讬谞谞讜 dict, 讗驻砖专 驻砖讜讟 诇讛注转讬拽 讗讜转讜, 讻诪讜 讘诪拽专讛 (1). 讛拽讜讚 注爪诪讜 诇拽讞 诇讬 拽爪转 驻讞讜转 诪-20 砖讜专讜转, 讜讗谞讬 讚讬 讘讟讜讞 砖讗驻砖专 诇讻转讜讘 讗转 讻诇 讛 if-讬诐 砖诇 讛讗诪爪注 讘爪讜专讛 讬讜转专 转诪爪讬转讬转 讗诐 诪讗讞讚讬诐 转谞讗讬诐:
def update_dict_with_subdicts(dict1, dict2):
    q = collections.deque([(dict1, dict2)])
    while len(q) > 0:
        d1, d2 = q.pop()
        for k in d2.keys():
            if k not in d1:
                d1[k] = d2[k]
            elif type(d1[k]) == dict and type(d2[k]) == dict:
                q.append((d1[k], d2[k]))
            elif type(d1[k]) != dict and type(d2[k]) == dict:
                d1[k] = {}
                q.append((d1[k], d2[k]))
            elif type(d2[k]) != dict:
                d1[k] = d2[k]
            else:
                raise Exception("wtf")
                
    return dict1

ToCode
1 419
# 讛注诇讗讛 诇 Production 讻谉, 讻讚讗讬 诇讘讚讜拽 讻诪讛 砖讬讜转专 讗转 讛诪注专讻转 讘住讘讬讘转 讘讚讬拽讜转. 讻谉, 讻讚讗讬 诇讛住转讻诇 注诇 讛拽讜讚 讜诇讞砖讜讘 讟讜讘 诪讛 讬讻讜诇 诇讛讬砖讘专. 讻谉, 讻讚讗讬 砖讬讛讬讛 诇讻诐 住讟 讞讝拽 砖诇 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转. 讗讘诇 - 讜讝讛 讛讚讘专 讛讞砖讜讘, 讻诇 讛住讬驻讜专 讛讝讛 诇讗 讬讻讜诇 诇讛讞诇讬祝 讗转 转砖讜诪转 讛诇讘 砖诇讻诐 讘讬讜诐 砖诇 讛注诇讗讛 诇 Production. 讻砖讛诪注专讻转 驻讜讙砖转 讗转 讛注讜诇诐 讛讻诇 讬讻讜诇 诇讛讬砖讘专 讜讗谞讞谞讜 诪讙诇讬诐 讛诪讜谉 讚讘专讬诐 砖诪注讟讬诐 诪爪诇讬讞讬诐 诇讞砖讜讘 注诇讬讛诐 讘砖诇讘 讛驻讬转讜讞. 诪讛 注讜砖讬诐? 1. 诪砖转诪砖讬诐 讘 Load Balancer 讻讚讬 诇讛讙讬砖 讗转 讛讙讬专住讗 讛讞讚砖讛 专拽 诇讞诇拽 拽讟谉 诪讛诪砖转诪砖讬诐 讘砖讘讜注 讛专讗砖讜谉 (Haproxy, ACL 讜注讜讙讬讜转 讬讛讬讜 讞讘专讬诐 讟讜讘讬诐 砖诇讻诐 讻砖诪讙讚讬专讬诐 讗转 讝讛). 2. 砖讜诪专讬诐 注诇 诪谞讙谞讜谉 讘讬讟讜诇 讛注诇讗转 讙讬专住讗 讘诇讞讬爪转 讻驻转讜专, 讻讚讬 砖讗诐 讘讟注讜转 讛注诇讬转诐 诪砖讛讜 砖讘讜专 讬讛讬讛 拽诇 诇讛转讞专讟 (讗谞讬 诪砖转诪砖 讘 Capistrano, 讗讘诇 讻诇 讻诇讬 Deployment 讟讜讘 爪专讬讱 诇注讘讜讚 讻讗谉). 3. 诇讜拽讞讬诐 讘讞砖讘讜谉 转讬拽讜谞讬 讘讗讙讬诐 诪 Production 讘诇讜讞讜转 讛讝诪谞讬诐 砖诇 讻诇 住讘讘 (讗诐 讛拽讜讚诐 讛住转讬讬诐 讘讛注诇讗转 讙讬专住讗).

ToCode
1 419
# 讟讬驻 JavaScript: 讗谞讬诪爪讬讛 驻砖讜讟讛 注诐 Velocity.JS 住驻专讬讬转 Velocity.JS 讛讬讗 讚专讱 拽诇讛 诪讗讜讚 诇讙专讜诐 诇讚讘专讬诐 诇讝讜讝 讗讜 诇专拽讚 注诇 讛诪住讱. 讛讬讗 诪砖转诪砖转 讘 requestAnimationFrame, 诪住驻拽转 API 住讜驻专 驻砖讜讟 讜讘讙讚讜诇 驻砖讜讟 注讜讘讚转. 诪转讗讬诐 诇讬讬砖讜诪讬诐 拽讟谞讬诐 砖诇讗 诪砖转诪砖讬诐 讘驻专讬讬诪讜讜专拽 讜讘讻诇 讝讗转 讗转诐 专讜爪讬诐 砖讬专讗讜 拽爪转 讬讜转专 讞诪讜讚讬诐. 讛住驻专讬讛 讻讜诇诇转 驻讜谞拽爪讬讬转 讻谞讬住讛 讘砖诐 Velocity 砖诪拽讘诇转 讻驻专诪讟专 专讗砖讜谉 讗诇诪谞讟 讘 DOM, 驻专诪讟专 砖谞讬 讗讜讘讬拽讟 砖诪转讗专 讗转 讛讗谞讬诪爪讬讛 讜驻专诪讟专 砖诇讬砖讬 讻诇 诪讬谞讬 讗驻砖专讜讬讜转 讗谞讬诪爪讬讛 诇砖诇讬讟讛 讘讻诇 讛驻专诪讟专讬诐 讛拽讟谞讬诐. 讛砖讜专讛 讛讘讗讛 诇诪砖诇 转讙专讜诐 诇讗诇诪谞讟 诪住讜讬诐 诇专拽讚 讻诪讜 讙'诇讬 诇诪砖讱 讞爪讬 砖谞讬讛:
Velocity(box, 'jello', { duration: 500 });
讜讛砖讜专讛 讛讝讜 转讙专讜诐 诇讜 诇讝讜讝 诇谞拽讜讚讛 诪住讜讬诪转 注诇 讛诪住讱 (讘转谞讗讬 砖讛 position 砖诇讜 诪讜讙讚专 诇 absolute):
Velocity(box, { left: 100, top: 100 }, { duration: 500 });
讘驻专诪讟专 讛砖谞讬 讗驻砖专 诇讻转讜讘 讻诇 诪讗驻讬讬谉 CSS 讘注讜诇诐, 讜讛砖讬谞讜讬 讬转讘爪注 讘讗谞讬诪爪讬讛. 讜讙诐 讬砖 转诪讬讻讛 讗讜讟讜诪讟讬转 讘讞讬讘讜专 讗谞讬诪爪讬讜转 讻讱 砖讗诐 谞讻转讜讘 讗转 砖转讬 讛砖讜专讜转 讬讞讚:
Velocity(box, 'jello', { duration: 500 });
Velocity(box, { left: 100, top: 100 }, { duration: 500 });
讛讗诇诪谞讟 讬拽讚讬砖 讞爪讬 砖谞讬讛 诇专拽讜讚 讻诪讜 讙'诇讬 讜讗讞专 讻讱 注讜讚 讞爪讬 砖谞讬讛 讻讚讬 诇专讜抓 诇谞拽讜讚讛 100,100 注诇 讛诪住讱. 讘讜讗讜 谞讞讘专 讗转 讛讻诇 讬讞讚 讘讚祝 HTML. 讘讛谞讞讛 砖讬砖 诇谞讜 HTML 砖谞专讗讛 讻讱:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF8" />
        <title>Animate.CSS Demo</title>
        <style>
            #box { width: 100px; height: 100px; background: blue; position: absolute; }
            body { position: relative; height: 100vh; padding: 0; margin: 0; }
        </style>
    </head>

    <body>
        <div id="box"></div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/2.0.5/velocity.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/2.0.5/velocity.ui.min.js"></script>
        <script src="demo3.js"></script>
    </body>
</html>
讗谞讬 讬讻讜诇 诇讛讜住讬祝 诇讜 讗转 讛 JavaScript 讛讘讗 讻讚讬 诇讙专讜诐 诇拽讜驻住讗 诇专讜抓 诪诪拽讜诐 诇诪拽讜诐 讜讙诐 诇专拽讜讚 讻诪讜 讙'诇讬 讻诇 驻注诐 砖诇讜讞爪讬诐 注诇讬讛:
const box = document.querySelector('#box');
function runaway() {
    const width = document.body.clientWidth - 100;
    const x = Math.random() * width;
    const height = document.body.clientHeight - 100;
    const y = Math.random() * height;
    Velocity(box, 'jello', { duration: 500 });
    Velocity(box, { left: x, top: y }, { duration: 500 });
}

runaway();
box.addEventListener('click', runaway);
讜讬砖 讙诐 拽讜讚驻谉: <iframe height="300" style="width: 100%;" scrolling="no" title="gOaozvr" src="https://codepen.io/ynonp/embed/gOaozvr?height=300&theme-id=20374&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true"> See the Pen <a href='https://codepen.io/ynonp/pen/gOaozvr'>gOaozvr</a> by Ynon Perek (<a href='https://codepen.io/ynonp'>@ynonp</a>) on <a href='https://codepen.io'>CodePen</a>. </iframe>

ToCode
1 419
# 诪讬诇讛 讗讞转 讘讬讜诐 讗讞转 讛讞讜讜讬讜转 砖讗谞讞谞讜 诇讗 诪诪砖 讬讜讚注讬诐 诇讛转诪讜讚讚 讗讬转谉 讛讬讗 诇诇诪讜讚 诪砖讛讜 诪诪砖 讙讚讜诇. 诪砖讛讜 砖讻砖讗转讛 诪转讞讬诇 讗讜转讜 讗转讛 讬讜讚注 砖讘诪拽专讛 讛讻讬 讟讜讘 讗转讛 讛讜诇讱 诇讛拽讚讬砖 讻诪讛 砖注讜转 讘讬讜诐 讘砖谞转讬讬诐 讛拽专讜讘讜转 讻讚讬 诇讛爪诇讬讞 诇注砖讜转 诪砖讛讜 诪讜注讬诇 拽讟谉. 讻讬 讛讘注讬讛 砖诪讗讜讚 拽砖讛 诇讛住转讻诇 讻诇 讻讱 专讞讜拽 讜注讜讚 诇砖诪讜专 注诇 诪讜讟讬讘爪讬讛. 转诪讬讚 讬砖 讘注讬讜转, 转诪讬讚 讬砖 讚讘专讬诐 讬讜转专 讞砖讜讘讬诐 讜讻诪讜讘谉 转诪讬讚 讬砖 讗转 讛转讞讜砖讛 砖诪诪讬诇讗 讗谞讬 讛讜诇讱 诇讛转讬讬讗砖 诪讝讛 诪转讬砖讛讜, 讗讝 注讚讬祝 诇讜讜转专 讻讘专 注讻砖讬讜. 讗讜谞讬讘专住讬讟讛 讗讜 拽讜专住 诇讟讜讜讞 讗专讜讱 注讜讝专讬诐 诇谞讜 诇讛转诪讜讚讚 注诐 讛拽讜砖讬 讻讬 讛诐 诪讗驻砖专讬诐 诇讛讜专讬讚 诪讛讙讘 讗转 讛讚讗讙讛 砖讝讛 诇讗 讬爪诇讬讞. 讻砖讗转讛 谞专砖诐 诇转讜讗专 砖谞讬 注诐 讛转诪讞讜转 讘 Machine Learning 讗转讛 讬讜讚注 砖讘注讜讚 砖谞转讬讬诐 讗转讛 转讛讬讛 讘诪拽讜诐 砖讬讻讜诇 诇讛转讞讬诇 诇讞驻砖 注讘讜讚讛 讘转讞讜诐. 讗讘诇 讻砖讗转讛 诪转讞讬诇 诇诇诪讜讚 讗转 讝讛 诪讗驻住 讜爪专讬讱 诇讘谞讜转 诇注爪诪讱 讗转 讻诇 讛转讜讻谞讬转, 驻讜讟谞爪讬讗诇 讛讬讗讜砖 讛讜讗 讛专讘讛 讬讜转专 讙讚讜诇. 砖讬讟讛 讗讞转 砖注讜讘讚转 讘砖讘讬诇讬 讻砖爪专讬讱 诇诇诪讜讚 诪砖讛讜 诪讗讜讚 讙讚讜诇 诇转拽讜驻转 讝诪谉 讗专讜讻讛 讛讬讗 诇讛讙讚讬专 讬注讚 讬讜诪讬 谞诪讜讱 诪诪砖. 诇诪砖诇 诇拽专讜讗 驻讬住拽讛 讘讬讜诐 讜诇讛讘讬谉 讗讜转讛, 讗讜 诇讻转讜讘 诪讗诪专 拽爪专 注诇 诪砖讛讜 拽讟谉 砖诇诪讚转讬. 讘专讜专 砖讗诐 讗谞讬 诇讜诪讚 专拽 驻讬住拽讛 讘讬讜诐 诪转讜讱 住驻专 注谞拽 砖爪专讬讱 诇拽专讜讗 注讜讚 10 讻诪讜讛讜 讘砖讘讬诇 诇讛讘讬谉 ML 讗谞讬 诇注讜诇诐 诇讗 讗住讬讬诐. 讗讘诇 讝讛 诪诪讬诇讗 诇讗 讬讛讬讛 讛诪爪讘: 讻砖讛讬注讚 讛讬讜诪讬 谞诪讜讱 讗谞讞谞讜 砖诪讞讬诐 讻诇 驻注诐 砖注讘专谞讜 讗讜转讜, 讜讝讛 注讜砖讛 讞砖拽 诇讛转讬讬砖讘 讜诇讛砖拽讬注 讬讜转专 讝诪谉, 讛砖拽注讛 砖诪讘讬讗讛 转讜爪讗讜转 讬讜转专 讟讜讘讜转. 诇讗讜专讱 讝诪谉 讛谞讬住讬讜谉 诇专讜抓 住驻专讬谞讟 讜诇讛住驻讬拽 诇诇诪讜讚 (诇诪砖诇 讗转 讻诇 专讬讗拽讟 讘砖讘讜注) 讛讜讗 讛专住谞讬. 讗诐 讬砖 诇讱 专讗讬讜谉 注讘讜讚讛 注诇 专讬讗拽讟 注讜讚 砖讘讜注 讛住讬讻讜讬 诇讛住驻讬拽 诇诇诪讜讚 讛讻诇 讘讝诪谉 讛讜讗 讻诪注讟 讗驻住讬. 讗讘诇, 讗诐 转砖讬诪讬 讬注讚 砖诇 诇讻转讜讘 转讜讻谞讬转 专讬讗拽讟 拽讟谞讛 讻诇 讬讜诐, 讗讝 讗讞专讬 讻诪讛 讬诪讬诐 讻讘专 讬讛讬讛 诇讱 讞砖拽 诇拽专讜讗 拽爪转 讬讜转专 注诇 讛转讜讻谞讬转 讛讬讜诪讬转 讗讜 诇讻转讜讘 讚讜讜拽讗 砖转讬 转讜讻谞讬讜转 讘讗讜转讜 讬讜诐 讜诇讗讟 诇讗讟 拽爪讘 讛诇讬诪讜讚 讬讙讚诇 讘讗讜驻谉 讟讘注讬.

ToCode
1 419
# 讟讘诇讗讜转 诇讜讙讬诐 讘讗转专 砖诇 讻诪讛 诪讗讜转 诪讘拽专讬诐 诪住驻讬拽 诇砖诪讜专 讗转 讻诇 讛诇讜讙讬诐 讘拽讜讘抓 讟拽住讟. 注诐 拽爪转 讬讚注 讘讘讬讟讜讬讬诐 专讙讜诇讗专讬讬诐 讜 grep 讗转诐 讬讻讜诇讬诐 诇诪爪讜讗 讗转 讻诇 诪讛 砖爪专讬讱, 讜 logrotate 诪讻住讛 讗转 讻诇 爪专讻讬 讛转讞讝讜拽讛 砖诇讻诐. 讘注诇讬讛 诇讗诇驻讬 讗讜 注砖专讜转 讗诇驻讬 诪讘拽专讬诐 讘讬讜诐 拽讜讘抓 诇讜讙讬诐 讻讘专 诇讗 注讜讝专. 讛诇讜讙讬诐 专爪讬诐 讛专讘讛 讬讜转专 诪讚讬 诪讛专 讘砖讘讬诇 砖讝讛 讬讛讬讛 讬注讬诇, 讜讗讬谉 诇讻诐 讚专讱 诇讞讘专 讻诪讛 讛讜讚注讜转 砖拽砖讜专讜转 诇讗讜转讜 谞讜砖讗 讻讚讬 诇讛转诪拽讚 注诇 讘注讬讛 讜诇转拽谉 讗讜转讛. 驻讛 讗谞讞谞讜 讻讘专 爪专讬讻讬诐 诇注讘讜专 诇谞讛诇 讗转 讛诇讜讙讬诐 讘讟讘诇讗讜转 讘讘住讬住 讛谞转讜谞讬诐, 诇讞砖讜讘 注诇 住讻讬诪讜转 谞讻讜谞讜转 讜注诇 拽砖专 讘讬谉 诇讜讙讬诐 砖诇 谞讜砖讗讬诐 砖讜谞讬诐 讜讻诪讜讘谉 诇讝讻讜专 诇诪讞讜拽 讗讜 诇讝专讜拽 诇讗专讻讬讜谉 诇讜讙讬诐 讬砖谞讬诐. 注诇讜转 讛拽诪讛 讙讘讜讛讛 讬讜转专, 注诇讜转 转讞讝讜拽讛 讙讘讜讛讛 讬讜转专 讗讘诇 讙诐 转诪讜专讛 讟讜讘讛 讬讜转专. 讜讘诪讬诇讬讜谞讬诐? 砖诐 讻讘专 谞爪讟专讱 讗转 Elastic Search 讜讗讜诇讬 Grafana 讻讚讬 诇拽讘诇 讗转 讛诪讬讚注 诪讗讜专讙谉 讜讘讙专驻讬诐, 诇拽讘诇 讗转专注讜转 讻砖讚讘专讬诐 诪转讞讬诇讬诐 诇讛讬砖讘专 讜讻诪讜讘谉 诇注拽讜讘 讗讞专讬 诪讛诇讻讬诐 诪讜专讻讘讬诐 讛谞驻专住讬诐 注诇 驻谞讬 诪住驻专 砖专转讬诐. 讞砖讜讘 诇专讗讜转 砖讻诪讜 讘谞注诇讬讬诐, 讗讬谉 讟注诐 诇讘讞讜专 诪讬讚讛 讙讚讜诇讛 讬讜转专. 注讘讜讚转 讛转讞讝讜拽讛 砖转爪讟专讻讜 诇讛砖拽讬注 讘驻讬转专讜谉 诇讜讙讬诐 诪转讜讞讻诐 讬讜转专 诪转拽讝讝转 注诐 讛讞讬住讻讜谉 讘讝诪谉 砖讗讜诇讬 转讙讬注讜 讗诇讬讜 讘诪注专讻转 拽讟谞讛. 讘诪讬诇讬诐 讗讞专讜转 - 讙诐 讗诐 Elastic Search 谞专讗讛 讻诪讜 讞诇讜诐, 讘讗转专 拽讟谉 讗驻砖专 诇诪爪讜讗 转砖讜讘讜转 讛专讘讛 讬讜转专 诪讛专 讘讚专讻讬诐 讬讜转专 驻专讬诪讬讟讬讘讬讜转.

ToCode
1 419
# 驻讬讬转讜谉, 诪住驻专讬诐 专讗砖讜谞讬讬诐 讜拽专讬讗讜转 砖诇 拽讜讚 诪讛讜 拽讜讚 拽专讬讗? 拽讜讚 拽专讬讗 讛讜讗 拽讜讚 砖注讜讝专 诇住驻专 讗转 讛住讬驻讜专 砖诇 讛讗诇讙讜专讬转诐 讘爪讜专讛 谞讜住驻转. 讛讜讗 拽讜讚 砖讻砖讗谞讞谞讜 诪住转讻诇讬诐 注诇讬讜 讗谞讞谞讜 诪讘讬谞讬诐 讟讜讘 讬讜转专 诪讛 讛诪转讻谞转转 专爪转讛 诇讛讙讬讚 讜讗讬讱 讛讬讗 专爪转讛 诇讛讙讬讚 讗转 讝讛. 拽讜讚 拽专讬讗 讛讜讗 拽讜讚 砖诪住驻专 住讬驻讜专 讜讛住讬驻讜专 讛讝讛 讛讜讗 讛讗诇讙讜专讬转诐. 讜拽讜讚 诇讗 拽专讬讗? 讻讻诇 砖讗谞讞谞讜 诪转专讞拽讬诐 诪讛讗诇讙讜专讬转诐 讜诪讜住讬驻讬诐 注讜讚 砖讜专讜转 诇拽讜讚 专拽 讘砖讘讬诇 讛诪讞砖讘, 讻讱 讛住讬驻讜专 砖诇谞讜 讛讜驻讱 驻讞讜转 拽专讬讗 讗讜 讘诪讬诇讬诐 讗讞专讜转 诇讻讝讛 砖拽砖讛 讬讜转专 诇讚讘专 注诇讬讜. 讗诐 讗谞讬 讞讜讝专 诇拽讜讚 讗讞专讬 讻诪讛 砖讘讜注讜转 砖诇讗 谞讙注转讬 讘讜 讜讗谞讬 诪讘讬谉 讘讚讬讜拽 诪讛 诪转讞讘专 诇诪讛 讜诇诪讛 - 讛讻诇 讟讜讘 讗谞讬 诪住转讻诇 注诇 拽讜讚 拽专讬讗. 讘讚专讱 讻诇诇 讗谞讞谞讜 谞爪讟专讱 讬讜转专 诪爪注讚 诪谞讟诇讬 讗讞讚 讘砖讘讬诇 诇讞讝讜专 诪讛拽讜讚 诇讗诇讙讜专讬转诐 讜砖讜讜讛 诇砖讬诐 诇讘 砖讝讛 讘讻讜讜谞讛. 拽讜讚 拽专讬讗 诇讙诪专讬 讝讛 讗讜诇讬 谞讞诪讚 讘转讜专 诪讗诪专 讘讜讬拽讬驻讚讬讛, 讗讘诇 讛专讘讛 驻注诪讬诐 讚讜讜拽讗 讻砖讗谞讞谞讜 诪转专讞拽讬诐 诪转讬讗讜专 讛讗诇讙讜专讬转诐 "讛谞讗讬讘讬" 讗讜 讛"讛讙讬讜谞讬" 讗谞讞谞讜 诪转拽讚诪讬诐 讘讘谞讬讬转 驻讬转专讜谞讜转 讟讜讘讬诐 讜诪讚讜讬拽讬诐 讬讜转专 诇讘注讬讛. 讗转 讛讚讜讙诪讗 讛讘讗讛 驻讙砖转讬 讘诪拽专讛 讻砖讞讬驻砖转讬 注诇 诪住驻专讬诐 专讗砖讜谞讬讬诐 讘专砖转. 诪住驻专 专讗砖讜谞讬 讛讜讗 诪住驻专 砖诪转讞诇拽 专拽 讘-1 讜讘注爪诪讜, 讜砖讬讟讛 拽诇讛 诇诪爪讜讗 讗转 讻诇 讛诪住驻专讬诐 讛专讗砖讜谞讬讬诐 讘转讜讱 诪拽讟注 诪住讜讬诐 谞拽专讗转 讛谞驻讛 砖诇 讗专讟讜住转谞住. 谞转讞讬诇 注诐 讛拽讜讚 讘讙讬专住讗 讛讻讬 谞讗讬讘讬转 砖诇讜 砖讛爪诇讞转讬 诇讞砖讜讘 注诇讬讛 讜转专讗讜 讗诐 讗转诐 诪爪诇讬讞讬诐 诇讛讘讬谉 讗转 讛讗诇讙讜专讬转诐:
def find_primes(start, end):
    primes = set(range(start, end))
    k = 2

    while k < end:
        for number in set(primes) - set([k]):
            if (number % k) == 0:
                primes.remove(number)

        k += 1

    return primes
讛谞讛 讛讛住讘专 砖诇讬 讘注讘专讬转: 谞讬拽讞 讗转 讻诇 讛诪住驻专讬诐 讘讟讜讜讞 讜讗讝 谞诪讞拽 诪讛诐 讗转 讻诇 讛讻驻讜诇讜转 砖诇 2. 讗讞专讬 讝讛 诪讜讞拽讬诐 诪讛诐 讗转 讻诇 讛讻驻讜诇讜转 砖诇 3, 讜讗讝 讗转 讻诇 讛讻驻讜诇讜转 砖诇 4 讜讻讱 讛诇讗讛 注讚 砖诪住讬讬诪讬诐 诇诪讞讜拽 讗转 讻诇 讛讻驻讜诇讜转 砖诇 讻诇 讛诪住驻专讬诐. 讛讙讬讜谞讬? 讛拽讜讚 诪转讗讬诐 诇转讬讗讜专? 讗谞讬 讞讜砖讘 砖讻谉. 讛讘注讬讛 砖讛拽讜讚 讛讝讛 讗讬讟讬 诇讛讞专讬讚. 诇拽讞 诇诪讞砖讘 砖诇讬 2 砖谞讬讜转 诇诪爪讜讗 砖讬砖谞诐 1229 诪住驻专讬诐 专讗砖讜谞讬讬诐 讘讬谉 2 诇-10,000. 讝讛 诪诪砖 诇讗讟. 拽诇 讙诐 诇专讗讜转 讗转 讛讘注讬讜转 讘诪谞讙谞讜谉 专拽 诪转讜讱 讛拽讜讚 (讗讜 诪转讜讱 讛转讬讗讜专 讘注讘专讬转): 1. 诇讗 爪专讬讱 诇讘讚讜拽 讗转 讻诇 讛讻驻讜诇讜转 砖诇 4. 讛专讬 讻讘专 诪讞拽谞讜 讗转 4 讻砖诪讞拽谞讜 讗转 2, 讜诇讻谉 诪讞拽谞讜 讙诐 讗转 讻诇 讛讻驻讜诇讜转 砖诇讜. 2. 诇讗 爪专讬讱 诇讛转拽讚诐 注诐 k 注讚 住讜祝 讛讟讜讜讞, 诪住驻讬拽 诇讛转拽讚诐 注讚 砖讜专砖 砖诇 end. 3. 诇讗 爪专讬讱 诇讛转拽讚诐 讻诇 驻注诐 讘-1, 讗驻砖专 诇讚诇讙 注诇 诪住驻专讬诐 讝讜讙讬讬诐 讜诇拽讚诐 讗转 k 讘-2. 4. 诇讗 爪专讬讱 诇讬爪讜专 set 讞讚砖 讻诇 讗讬讟专爪讬讛, 讗驻砖专 诇诪讞讜拽 转诪讬讚 诪讗讜转讜 set 诪拽讜专讬. 5. 讛专讘讛 讬讜转专 拽诇 诇讞驻砖 讛驻讜讱 - 讘诪拽讜诐 诇专讜抓 注诇 讻诇 讛诪住驻专讬诐 讜诇诪讞讜拽 讗转 讗诇讛 砖诪转讞诇拽讬诐 讘 k, 讗驻砖专 诇讘谞讜转 讗转 讻诇 讛讻驻讜诇讜转 砖诇 k 讜诇诪讞讜拽 专拽 讗讜转谉 (驻砖讜讟 诇讛转拽讚诐 讘爪注讚讬诐 讙讚讜诇讬诐 讬讜转专). 讗讞专讬 砖讞讬讘专转讬 讗转 讻诇 讛讗讜驻讟讬诪讬讝爪讬讜转 讛讙注转讬 诇拽讜讚 讛讘讗:
def find_primes(start, end):
    k = start if start % 2 == 1 else start + 1
    primes = set(range(start, end)) - set(range(4, end, 2))

    while k < math.sqrt(end) + 1:
        i = 2 * k
        while i < end:
            if i in primes:
                primes.remove(i)
            i += k

        while True:
            k += 2
            if k in primes: break

    return primes
讗谞讬 讗讜讛讘 讗讜转讜. 讗讜诇讬 讗驻砖专 诇讻转讜讘 讙讬专住讗 讬讜转专 拽专讬讗讛 讗讘诇 讘讙讚讜诇 讛讜讗 讚讬 诪诪讞讬砖 讗转 讛讗诇讙讜专讬转诐 讗讞专讬 讻诇 讛讗讜驻讟讬诪讬讝爪讬讜转 讜讻诪讜讘谉 诪讘讞讬谞转 诪讛讬专讜转 注诐 讝讛 讻讘专 讗驻砖专 诇注讘讜讚. 讗讬转讜专 讻诇 1229 讛诪住驻专讬诐 讛专讗砖讜谞讬讬诐 注讚 10,000 诇拽讞 0.04 砖谞讬讜转, 讜讙诐 讻砖注诇讬转讬 诇讞驻砖 讗转 讻诇 讛诪住驻专讬诐 讛专讗砖讜谞讬讬诐 注讚 诪讬诇讬讜谉 讛爪诇讞转讬 诇诪爪讜讗 讗转 讻诇 78,498 讛诪住驻专讬诐 讘驻讞讜转 诪砖谞讬讛 (0.53 砖谞讬讜转 诇诪讬 砖专讜爪讛 诇讚讬讬拽). 讗讘诇- 讜讝讜 讛谞拽讜讚讛 讛讞砖讜讘讛 讻讗谉 (讞讜抓 诪讛讻讬祝 砖诇 诪爪讬讗转 诪住驻专讬诐 专讗砖讜谞讬讬诐 讻诪讜讘谉) - 讗诐 诪讬砖讛讜 专讜爪讛 诇讛讘讬谉 讗转 诇讘 讛讗诇讙讜专讬转诐 讛拽讜讚 讛讗讬讟讬 诪砖诪砖 谞拽讜讚转 讻谞讬住讛 讛专讘讛 讬讜转专 讟讜讘讛. 讛讜讗 诪住讘讬专 讘讚讬讜拽 诪讛 讗谞讞谞讜 注讜砖讬诐 讜诪讚诇讙 注诇 讛砖讟讜讬讜转 砖爪专讬讱 诇讻转讜讘 讘砖讘讬诇 砖讝讛 讙诐 讬注讘讜讚 讟讜讘. 诪爪讚 砖谞讬, 讛讙讬专住讗 讛砖谞讬讛 驻讞讜转 拽专讬讗讛 讻讬 讛讬讗 讘讗诪转 诪住驻专转 住讬驻讜专 讛专讘讛 讬讜转专 诪讜专讻讘. 讬讜转专 诪驻注诐 讗讞转 拽专讛 砖诪爪讗转讬 拽讜讚 讘讗讬谞讟专谞讟 砖谞专讗讛 讻诪讜 讛讙讬专住讗 讛砖谞讬讛. 讛讜讗 讻诇诇 讗转 讻诇 讛讗讜驻讟讬诪讬讝爪讬讜转 讜讗转 讻诇 讛讚讘专讬诐 讛谞讻讜谞讬诐 讻讚讬 砖讛转讜讻谞讬转 转注讘讜讚, 讜讘讙诇诇 讝讛 讛讬讛 讛专讘讛 讬讜转专 拽砖讛 诇讛讘讬谉 讗讜转讜. 诪爪讚 砖谞讬 诇讗 诪注讟 拽讜讚讬诐 砖诪爪讗转讬 讘讗讬谞讟专谞讟 谞专讗讜 讻诪讜 讛讙讬专住讗 讛专讗砖讜谞讛 - 讛诐 诇讗 讻诇诇讜 诪住驻讬拽 讗讜驻讟讬诪讬讝爪讬讜转 讜讟讬驻讜诇 讘诪拽专讬 拽爪讛 讜讗讬讱 砖转砖诇讘讜 讗讜转诐 讘诪注专讻转 讗诪讬转讬转 讛诐 讬讬砖讘专讜. 讘专讜讘 讛讘注讬讜转 砖转讙讬注讜 诇驻转讜专 讗讬 讗驻砖专 讘讗诪转 诇讘专讜讞 诪诇注砖讜转 讗转 讛注讘讜讚讛 讛拽砖讛 砖诇 诇讛讘讬谉 讗转 讛拽讜讚 讜讗讝 诇专讗讜转 讗诐 讛拽讜讚 砖诪爪讗转诐 讘讗诪转 驻讜转专 讗转 讛讘注讬讛 讘爪讜专讛 砖讙诐 注讜讘讚转 讘诪注专讻转 讗诪讬转讬转.

ToCode
1 419
# 讚讚诇讬讬谞讬诐 讜诪砖讘专讬 讗诪讜谉 讗讞转 讛讘注讬讜转 注诐 讚讚诇讬讬谞讬诐 砖讗驻转讬讬诐 诪讚讬 讛讬讗 讬爪讬专转 诪砖讘专 讗诪讜谉 诪转诪砖讱 讘讬谉 讛诪转讻谞转讬诐 诇讛谞讛诇讛 (专讗讜 诇诪砖诇 讗转 讛驻讜住讟 讛讝讛 注诐 讛讻讜转专转 "讛注专讻转 讛讝诪谞讬诐 砖诇讻诐 讛讬讗 讘讚讬讞讛"). 讗讞专讬 驻注诪讬讬诐-砖诇讜砖 讗祝 讗讞讚 诇讗 诇讜拽讞 讘专爪讬谞讜转 讗转 讛讚讚 诇讬讬谉 砖讛讘讜住 拽讘注 讜讗驻讬诇讜 讗讜转讜 讘讜住 讬讜讚注 砖讛诪讜爪专 诇讗 讬讛讬讛 诪讜讻谉 讘讝诪谉 砖拽讘注. 砖讬讟讜转 注讘讜讚讛 诪转拽讚诪讜转 诪谞住讜转 诇讛转诪讜讚讚 注诐 讝讛 讘讗诪爪注讜转 讛讙讚专转 "住讬驻讜专讬诐" 讜驻讙讬砖讜转 讘注诪讬讚讛 讘转讞讬诇转 讻诇 讬讜诐, 讜讻专讟讬住讬讜转 讜诇讜讞讜转 - 讗讘诇 诪注讟讬诐 讛爪讜讜转讬诐 砖诪爪诇讬讞讬诐 诇讛讙讚讬专 讬注讚 砖诇 讝诪谉 讜诇注诪讜讚 讘讜. 讘讚专讱 讻诇诇 讗谞讞谞讜 诪讙讬注讬诐 诇讚讚诇讬讬谉 注诐 讞爪讬 诪讛转讻讜诇讛 砖专爪讬谞讜, 讗讞专讬 砖谞砖讗专谞讜 讛诪讜谉 砖注讜转 谞讜住驻讜转 讻讚讬 诇讛住驻讬拽 讻诪讛 砖讬讜转专. 讛讘注讬讛 砖注诪讬讚讛 讘讚讚诇讬讬谉 讚讜专砖转 驻砖专讜转 诪讻诇 讛讗专讙讜谉: 讝讛 诇讗 诪住驻讬拽 砖诪转讻谞转转 诪转讗诪爪转 诇讛讙讬注 注诐 讛拽讜讚 诪讜讻谉 讘转讗专讬讱 砖谞拽讘注, 爪专讬讱 讙诐 讗谞砖讬 讘讚讬拽讜转 砖讬注讘讬专讜 诪讬讚注 讗诪讬谉 讜诪讚讜讬拽 注诇 讛讘注讬讜转, 讗谞砖讬 诪讜爪专 砖讬注讚讻谞讜 讗转 讛转讻讜诇讜转 转讜讱 讻讚讬 转谞讜注讛 讜诪谞讛诇讬诐 砖诇讗 诪驻讞讚讬诐 诇讛注诇讜转 讙讬专住讗 诇讗 诪讜砖诇诪转 讜诪讜讻谞讬诐 诇住驻讜讙 讗转 讛爪注拽讜转 砖诇 讛诇拽讜讞讜转. 讜讗驻砖专 讻诪讜讘谉 讙诐 讗讞专转 - "讝讛 讬讛讬讛 诪讜讻谉 讻砖讝讛 讬讛讬讛 诪讜讻谉" 讝讜 注诪讚讛 诇讙讬讟讬诪讬转 诇讙诪专讬 讗诐 讗讬讻讜转 讛诪讜爪专 讞砖讜讘讛 诇讻诐 讬讜转专 诪讗砖专 诇砖讞专专 讗讜转讜. 诇诇讗专讬 讜讜诇 诇拽讞 注砖专讬诐 砖谞讛 诇砖讞专专 讗转 perl6, 讗讘诇 讬砖 讛专讘讛 诪讗讜讚 驻专讜讬拽讟讬 拽讜讚 驻转讜讞 砖诪转讗诪爪讬诐 诇砖讞专专 讙讬专住讗 讘讝诪谉 讗讘诇 诇讗 诪转讗讘讚讬诐 注诇 讝讛. 讗祝 讗讞讚 诇讗 谞驻诇 诪讛讻住讗 讻砖 Concurrent Mode 砖诇 专讬讗拽讟 诇讗 讛讬讛 诪讜讻谉 讘讗诪爪注 2019 (讜注讚讬讬谉 诇讗 诪讜讻谉 诇拽专讗转 讗诪爪注 2020). 讗转诐 拽讜讘注讬诐 讗讬讱 讗转诐, 讛讞讘专讬诐 砖诇讻诐 讜讛诇拽讜讞讜转 砖诇讻诐 讬转讬讞住讜 诇讚讚诇讬讬谉 讛讘讗 砖转驻专住诪讜 - 讗诐 讗转诐 诪讜讻谞讬诐 诇讛转驻砖专 注诇 讗讬讻讜转 讛诪讜爪专 讻讚讬 诇讛注诇讜转 讙讬专住讗 讘讝诪谉 讝讛 诪注讜诇讛, 驻专住讜诐 讛讚讚诇讬讬谉 专拽 讬讬爪讜专 讗诪讜谉. 讗诐 诪爪讚 砖谞讬 讗讬谉 诇讻诐 讻讜讜谞讛 诇注砖讜转 驻砖专讜转 讻讜讗讘讜转 注讚讬祝 诇驻专住诐 讗讜转讜 讻讛注专讻讛 讜诇讗 讻转讗专讬讱 住驻爪讬驻讬. 讗祝 讗讞讚 诇讗 谞讜驻诇 诪讛讻住讗 讻砖"谞专讗讛 诇讬 砖讝讛 讬讛讬讛 诪讜讻谉 注讚 住讜祝 讛专讘注讜谉" 讛讜驻讱 诇"诇讗 讛住驻拽谞讜 讘专讘注讜谉 2, 谞拽讜讜讛 砖讝讛 讬讛讬讛 诪讜讻谉 注讚 住讜祝 2020". 诇注讜诪转 讝讗转 讻砖诪驻专住诪讬诐 诇讜"讝 讙讬专住讗讜转 注转讬讚讬讜转 注诐 转讗专讬讻讬诐 讻讚讗讬 诪讗讜讚 诇注砖讜转 诪讗诪抓 讜驻砖专讜转 讻讚讬 砖讚讘专讬诐 讬拽专讜 讻诪讜 砖讻转讘转诐.

ToCode
1 419
# 转讻谞讜转 诪讜谞讞讛 注爪诪讬诐 讜诪讬讚注 砖诇讗 专讜讗讬诐 拽专讗转讬 讛讬讜诐 驻讜住讟 砖讻转讘转讬 诇驻谞讬 讻诪讛 讬诪讬诐 注诇 诪讬诪讜砖 讗诇讙讜专讬转诐 BFS 讘 Python 讜讙讬诇讬转讬 讘讗讙 砖诇讗 砖诪转讬 诇讘 讗诇讬讜 讘讻转讬讘讛 讛专讗砖讜谞讛 砖诇 讛拽讜讚, 讗讘诇 砖诪讗驻讬讬谉 诇讗 诪注讟 诪讛讘注讬讜转 讘转讻谞讜转 诪讜谞讞讛 注爪诪讬诐. 讗谞讬 诪讝讻讬专 砖讛拽讜讚 诇诪讬诪讜砖 BFS 砖讻转讘转讬 谞专讗讛 讘诪拽讜专 讻讱 (讝讛 讛拽讜讚 注诐 讛讘讗讙):
def bfs(q, callback):
    while len(q) > 0:
        node = q.popleft()

        # Skip this node, we've already visited it
        if hasattr(node, 'visited') and node.visited is True: continue

        # Now we can start processing the node:
        # 1. Let's notify outside code that we found a new node
        callback(node)

        # 2. Let's mark it as visited so we won't have to
        #    process it again
        node.visited = True

        # 3. Let's add all of its neighbors to the queue
        #    so we'll be able to process them too
        for friend in node.neighbours:
            q.append(friend)
讝讬讛讬转诐 讗转 讛讘讗讙? 讗诐 诇讗, 拽讞讜 讻诪讛 讚拽讜转 诇拽专讜讗 讗转 讝讛 砖讜讘. 讛讘注讬讛 讛讬讗 讛诪谞讙谞讜谉 砖砖讜诪专 讛讗诐 讻讘专 讘讬拽专谞讜 讘 Node 诪住讜讬诐 讗讜 诇讗: 讛诪谞讙谞讜谉 诪住诪谉 讗转 讛 Node 讘转讜专 讻讝讛 砖讘讬拽专谞讜 讘讜 讻讚讬 砖诇讗 谞讞讝讜专 诇讗讜转讜 Node 驻注诪讬讬诐, 讗讘诇 诪讛 拽讜专讛 讗诐 谞专爪讛 诇讛驻注讬诇 讗转 bfs 驻注诐 砖谞讬讛 注诇 讗讜转讜 注抓? 讘诪爪讘 讻讝讛 讻诇 讛爪诪转讬诐 讻讘专 诪住讜诪谞讬诐 讘转讜专 讻讗诇讛 砖讘讬拽专谞讜 讘讛诐 讜诇讻谉 讛专讬爪讛 讛砖谞讬讛 转讞讝讜专 诪讬讚. 讝讜 讘注讬讛 讗讜驻讬讬谞讬转 诇转讻谞讜转 诪讜谞讞讛 注爪诪讬诐 诪讗讞专 讜讻砖讛讗讜讘讬拽讟讬诐 注爪诪诐 砖讜诪专讬诐 讗转 讛诪讬讚注, 讜讛诪讬讚注 诪驻讜讝专 注诇 驻谞讬 讗讜讘讬拽讟讬诐 专讘讬诐 讘转讜讻谞讬转, 讝讜 讗讞专讬讜转 砖诇谞讜 诇讝讻讜专 诇讗驻住 讗转 讛诪讬讚注 讻砖住讬讬诪谞讜 讗讬转讜 - 讗讞专讬讜转 砖拽诇 诇砖讻讜讞 诪诪谞讛. 驻讬转专讜谉 讗讞讚 拽诇 诇讘注讬讛 注讘讜专 诪谞讙谞讜谉 讛 bfs 讬讛讬讛 诇讛砖转诪砖 讘诪讘谞讛 谞转讜谞讬诐 讞讬爪讜谞讬 讜诇砖诪讜专 讘讜 讗转 讻诇 讛爪诪转讬诐 讘讛诐 讘讬拽专谞讜. 讻讱 谞专讗讛 讛拽讜讚 注诐 拽讘讜爪讛:
def bfs(q, callback):
    visited_nodes = set()
    while len(q) > 0:
        node = q.popleft()

        # Skip this node, we've already visited it
        if node in visited_nodes: continue

        # Now we can start processing the node:
        # 1. Let's notify outside code that we found a new node
        callback(node)

        # 2. Let's mark it as visited so we won't have to
        #    process it again
        visited_nodes.add(node)

        # 3. Let's add all of its neighbors to the queue
        #    so we'll be able to process them too
        for friend in node.neighbours:
            q.append(friend)
讝讛 讙诐 讛驻讬转专讜谉 砖注讻砖讬讜 诪讜驻讬注 讘驻讜住讟 讛诪拽讜专讬 讻讚讬 诇讗 诇讛砖讗讬专 砖诐 讟注讜讬讜转. 驻讬转专讜谉 砖谞讬 砖诪注谞讬讬谉 诇专讗讜转 注讜砖讛 砖讬诪讜砖 讘 ExitStack 讻讚讬 诇讛讜住讬祝 拽讜讚 谞讬拽讜讬 讗讞专讬 讻诇 砖讬谞讜讬, 讝讛 谞专讗讛 讻讱:
from contextlib import ExitStack
def bfs(q, callback):
    with ExitStack() as stack:
        while len(q) > 0:
            node = q.popleft()

            # Skip this node, we've already visited it
            if hasattr(node, 'visited') and node.visited is True: continue

            # Now we can start processing the node:
            # 1. Let's notify outside code that we found a new node
            callback(node)

            # 2. Let's mark it as visited so we won't have to
            #    process it again
            node.visited = True
            stack.callback(node.reset_visited)

            # 3. Let's add all of its neighbors to the queue
            #    so we'll be able to process them too
            for friend in node.neighbours:
                q.append(friend)
驻讬转专讜谉 讝讛 讬讜转专 讙谞专讬 讜讬讜转专 讗讜驻讬讬谞讬 诇讙讬砖讛 诪讜谞讞讬转 注爪诪讬诐 讻讬讜讜谉 砖讗驻砖专 诇讛讜住讬祝 讻诇 Callback Function 砖专讜爪讬诐 诇 Exit Stack, 讜讘住讜祝 讘诇讜拽 讛 with 讘讗讜驻谉 讗讜讟讜诪讟讬 驻讬讬转讜谉 讬专讬抓 讗转 讻诇 拽讜讚讬 讛谞讬拽讜讬 砖诇谞讜. 讛讜讗 讙诐 讬讜转专 诪转讗讬诐 诇讙讬砖转 讛 Object Oriented 讻讬讜讜谉 砖讻诇 讗讜讘讬拽讟 Node 讗讞专讗讬 注诇 拽讜讚 讛谞讬拽讜讬 砖诇讜.