From 8dfbcf170227755e1bcf20248c6f0215df192b4f Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Mon, 1 Feb 2016 13:33:52 +0800 Subject: [PATCH 01/36] add eval --- eval/eval_hello.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 eval/eval_hello.py diff --git a/eval/eval_hello.py b/eval/eval_hello.py new file mode 100644 index 0000000..68a8bcb --- /dev/null +++ b/eval/eval_hello.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# http://www.mojidong.com/python/2013/05/10/python-exec-eval/ + +a = 1 +print(eval("a + 1")) + +a = 1 +g = { + 'a': 10 +} +print(eval("a + 1", g)) + +a = 10 +b = 20 +c = 20 +g = { + 'a': 6, + 'b': 8 +} +l = { + 'b': 9, + 'c': 10 +} +print(eval("a+b+c", g, l)) + +print(eval('abs(a)',{'__builtins__':__builtins__, 'a':-1})) +# eval('abs(a)',{'__builtins__':None, 'a':-1}) From eb3b01f84ea8e3f8fe4a4403e1278005e6675541 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Mon, 1 Feb 2016 13:34:10 +0800 Subject: [PATCH 02/36] add exec --- exec/exec_hello.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 exec/exec_hello.py diff --git a/exec/exec_hello.py b/exec/exec_hello.py new file mode 100644 index 0000000..3110ae2 --- /dev/null +++ b/exec/exec_hello.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# http://www.mojidong.com/python/2013/05/10/python-exec-eval/ + +a = 2 +exec "a=1" +print(a) + +a = 10 +b = 20 +g = { + 'a':6, + 'b':8 +} +exec "global a; print a,b" in g + +a = 10 +b = 20 +c = 20 +g = { + 'a':6, + 'b': 8 +} +l = { + 'b':9, + 'c':10 +} +exec "global a;print a,b,c" in g,l From 9bcba56eae9c5c06d9451311edc8da8e283e16f6 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Mon, 1 Feb 2016 14:49:51 +0800 Subject: [PATCH 03/36] add some practices --- ffmpeg/read_write_audio_framee.py | 0 pyamf/amf_version.py | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 ffmpeg/read_write_audio_framee.py create mode 100644 pyamf/amf_version.py diff --git a/ffmpeg/read_write_audio_framee.py b/ffmpeg/read_write_audio_framee.py new file mode 100644 index 0000000..e69de29 diff --git a/pyamf/amf_version.py b/pyamf/amf_version.py new file mode 100644 index 0000000..49b02bb --- /dev/null +++ b/pyamf/amf_version.py @@ -0,0 +1,9 @@ + +from pyamf import AMF0, AMF3 +from pyamf.remoting.client import RemotingService + +gateway = 'http://demo.pyamf.org/gateway/helloworld' +client = RemotingService(gateway, amf_version=AMF3) +service = client.getService('echo') + +print service("Hello AMF3 world!") From ed6c276f14dc2df25f7931777e1bd285a6fb91de Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Sat, 20 Feb 2016 16:54:13 +0800 Subject: [PATCH 04/36] pygments: add simple.py --- pygments/simple.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 pygments/simple.py diff --git a/pygments/simple.py b/pygments/simple.py new file mode 100644 index 0000000..de0bff5 --- /dev/null +++ b/pygments/simple.py @@ -0,0 +1,6 @@ +from pygments import highlight +from pygments.lexers import PythonLexer +from pygments.formatters import HtmlFormatter + +code = 'print "Hello World"' +print highlight(code, PythonLexer(), HtmlFormatter()) From d9ced94c83cbef7d2369f55b5d495585bce93467 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Wed, 9 Mar 2016 20:45:56 +0800 Subject: [PATCH 05/36] tornado: add hello.py --- tornado/hello.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tornado/hello.py diff --git a/tornado/hello.py b/tornado/hello.py new file mode 100644 index 0000000..39abfca --- /dev/null +++ b/tornado/hello.py @@ -0,0 +1,16 @@ +import tornado.ioloop +import tornado.web + +class MainHandler(tornado.web.RequestHandler): + def get(self): + self.write("Hello, world") + +def make_app(): + return tornado.web.Application([ + (r"/", MainHandler), + ]) + +if __name__ == "__main__": + app = make_app() + app.listen(8888) + tornado.ioloop.IOLoop.current().start() From b79ccfa04299021f98f054080f8ef28546f41bd1 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Fri, 18 Mar 2016 19:24:06 +0800 Subject: [PATCH 06/36] add duck_typing --- duck_typing/polymorphism.py | 22 ++++++++++++++++++++++ duck_typing/redirect_stdout.py | 10 ++++++++++ 2 files changed, 32 insertions(+) create mode 100644 duck_typing/polymorphism.py create mode 100644 duck_typing/redirect_stdout.py diff --git a/duck_typing/polymorphism.py b/duck_typing/polymorphism.py new file mode 100644 index 0000000..e1f334f --- /dev/null +++ b/duck_typing/polymorphism.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +class Duck: + def quack(self): + print "Quaaaaaack!" + +class Bird: + def quack(self): + print "bird imitate duck." + +class Doge: + def quack(self): + print "doge imitate duck." + +def in_the_forest(duck): + duck.quack() + +duck = Duck() +bird = Bird() +doge = Doge() +for x in [duck, bird, doge]: + in_the_forest(x) diff --git a/duck_typing/redirect_stdout.py b/duck_typing/redirect_stdout.py new file mode 100644 index 0000000..9cdb6d3 --- /dev/null +++ b/duck_typing/redirect_stdout.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +#coding=utf-8 + +import sys + +sys.stdout = open('stdout.log', 'a') # 只要是 file-like, 不管是什么类型 +print 'foo' + +sys.stdout = sys.__stdout__ # 恢复 +print 'bar' From df9777aae2f795d4f490e05c53400254e9393b57 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Wed, 13 Apr 2016 15:58:51 +0800 Subject: [PATCH 07/36] add cffi --- cffi/_simple_example.py | 8 ++++++++ cffi/main.py | 7 +++++++ cffi/simple_example_build.py | 15 +++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 cffi/_simple_example.py create mode 100644 cffi/main.py create mode 100644 cffi/simple_example_build.py diff --git a/cffi/_simple_example.py b/cffi/_simple_example.py new file mode 100644 index 0000000..2689d2b --- /dev/null +++ b/cffi/_simple_example.py @@ -0,0 +1,8 @@ +# auto-generated file +import _cffi_backend + +ffi = _cffi_backend.FFI('_simple_example', + _version = 0x2601, + _types = b'\x00\x00\x04\x0D\x00\x00\x03\x03\x00\x00\x01\x0F\x00\x00\x02\x01\x00\x00\x07\x01', + _globals = (b'\x00\x00\x00\x23printf',0,), +) diff --git a/cffi/main.py b/cffi/main.py new file mode 100644 index 0000000..d7195d8 --- /dev/null +++ b/cffi/main.py @@ -0,0 +1,7 @@ +from _simple_example import ffi + +lib = ffi.dlopen(None) # Unix: open the standard C library +#import ctypes.util # or, try this on Windows: +#lib = ffi.dlopen(ctypes.util.find_library("c")) + +lib.printf(b"hi there, number %d\n", ffi.cast("int", 2)) diff --git a/cffi/simple_example_build.py b/cffi/simple_example_build.py new file mode 100644 index 0000000..b788ce1 --- /dev/null +++ b/cffi/simple_example_build.py @@ -0,0 +1,15 @@ +# file "simple_example_build.py" + +# Note: this particular example fails before version 1.0.2 +# because it combines variadic function and ABI level. + +from cffi import FFI + +ffi = FFI() +ffi.set_source("_simple_example", None) +ffi.cdef(""" + int printf(const char *format, ...); +""") + +if __name__ == "__main__": + ffi.compile() From ef6c880837cb7b7cfed5972284c0f1d3a5a075bf Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Sun, 24 Apr 2016 14:05:15 +0800 Subject: [PATCH 08/36] add v2ex --- v2ex/sign.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 v2ex/sign.py diff --git a/v2ex/sign.py b/v2ex/sign.py new file mode 100644 index 0000000..d0fd498 --- /dev/null +++ b/v2ex/sign.py @@ -0,0 +1,29 @@ +# coding:utf-8 + +import re +import requests + +session = requests.Session() + +# 领取 X 铜币 +# 每日登录奖励已领取 + +base_headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.71 Safari/537.36 OPR/35.0.2066.23 (Edition beta)', 'Referer': 'http://v2ex.com/signin'} + +session.headers = base_headers + +resp = session.get('http://v2ex.com/signin') +u, p = re.findall(r'class="sl" name="([0-9A-Za-z]{64})"', resp.text) +once_code = re.search(r'value="(\d+)" name="once"', resp.text).group(1) + +resp = session.post('http://v2ex.com/signin', + {u: 'username', p: 'password', 'once': once_code, 'next': '/'}) +resp = session.get('http://v2ex.com/mission/daily') + +if u'每日登录奖励已领取' in resp.text: + print('Already got it.') +else: + resp = session.get( + 'http://v2ex.com' + re.search(r'/mission/daily/redeem\?once=\d+', resp.text).group()) + print(resp.ok) From 52f0f634fd11568f94377e1051e6892ae998e1e2 Mon Sep 17 00:00:00 2001 From: "James (Jimi) Peters" Date: Tue, 24 May 2016 22:36:48 +1200 Subject: [PATCH 09/36] Update pprint_pprint.py --- pprint/pprint_pprint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pprint/pprint_pprint.py b/pprint/pprint_pprint.py index 0de07a6..31b3178 100644 --- a/pprint/pprint_pprint.py +++ b/pprint/pprint_pprint.py @@ -1,7 +1,7 @@ #!/usr/bin/env python -"""Pretty print with pprint - +""" +Pretty print with pprint """ from pprint import pprint From ce9d27945e88847517c27299ba5487f191dac598 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Fri, 17 Jun 2016 16:13:59 +0800 Subject: [PATCH 10/36] add redismq --- redis/redismq/elect.py | 28 ++++++++++++++++++++++ redis/redismq/redismq.py | 33 ++++++++++++++++++++++++++ redis/redismq/signal_wait.py | 45 ++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 redis/redismq/elect.py create mode 100644 redis/redismq/redismq.py create mode 100644 redis/redismq/signal_wait.py diff --git a/redis/redismq/elect.py b/redis/redismq/elect.py new file mode 100644 index 0000000..26203dc --- /dev/null +++ b/redis/redismq/elect.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import redis + +rc = redis.StrictRedis(host='localhost', port=6379, db=0) +local_selector = 0 + + +def master(): + global local_selector + master_selector = rc.incr('master_selector') + if master_selector == 1: + # initial / restarted + local_selector = master_selector + else: + if local_selector > 0: + # I'm the master before + if local_selector > master_selector: + # lost, maybe the db is fail-overed. + local_selector = 0 + else: + # continue to be the master + local_selector = master_selector + if local_selector > 0: + # I'm the current master + rc.expire('master_selector', 20) + return local_selector > 0 diff --git a/redis/redismq/redismq.py b/redis/redismq/redismq.py new file mode 100644 index 0000000..a0c2eb1 --- /dev/null +++ b/redis/redismq/redismq.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import redis + +rc = redis.StrictRedis(host='localhost', port=6379, db=0) + + +def fifo_push(q, data): + rc.lpush(q, data) + + +def fifo_pop(q): + return rc.rpop(q) + + +def filo_push(q, data): + rc.lpush(q, data) + + +def filo_pop(q): + return rc.lpop(q) + + +def safe_fifo_push(q, data): + rc.lpush(q, data) + + +def safe_fifo_pop(q, cache): + msg = rc.rpoplpush(q, cache) + # check and do something on msg + rc.lrem(cache, 1) # remove the msg in cache list. + return msg diff --git a/redis/redismq/signal_wait.py b/redis/redismq/signal_wait.py new file mode 100644 index 0000000..612b71e --- /dev/null +++ b/redis/redismq/signal_wait.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import redis, time, random + +rc = redis.StrictRedis(host='localhost', port=6379, db=0) + + +def wait(wait_for): + ps = rc.pubsub() + ps.subscribe(wait_for) + ps.get_message() + wait_msg = None + while True: + msg = ps.get_message() + if msg and msg['type'] == 'message': + wait_msg = msg + break + time.sleep(0.001) + ps.close() + return wait_msg + + +def signal_broadcast(wait_in, data): + wait_count = rc.publish(wait_in, data) + return wait_count + + +single_cast_script = """ + local channels = redis.call('pubsub', 'channels', ARGV[1]..'*'); + if #channels == 0 then + return 0; + end; + local index = math.mod(math.floor(tonumber(ARGV[2])), #channels) + 1; + return redis.call('publish', channels[index], ARGV[3]); +""" + + +def wait_single(channel, myid): + return wait(channel + myid) + + +def signal_single(channel, data): + rand_num = int(random.random() * 65535) + return rc.eval(single_cast_script, 0, channel, str(rand_num), str(data)) From 94e6d771d0e27c1558ea69bf1dac49b937fb5f9c Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Wed, 22 Jun 2016 13:43:15 +0800 Subject: [PATCH 11/36] wsgiref: add simple --- wsgiref/simple/hello.py | 7 +++++++ wsgiref/simple/server.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 wsgiref/simple/hello.py create mode 100644 wsgiref/simple/server.py diff --git a/wsgiref/simple/hello.py b/wsgiref/simple/hello.py new file mode 100644 index 0000000..c0ba668 --- /dev/null +++ b/wsgiref/simple/hello.py @@ -0,0 +1,7 @@ +# hello.py + +def application(environ, start_response): + start_response('200 OK', [('Content-Type', 'text/html')]) + # return [b'

Hello, web!

'] + body = '

Hello, %s!

' % (environ['PATH_INFO'][1:] or 'web') + return [body.encode('utf-8')] diff --git a/wsgiref/simple/server.py b/wsgiref/simple/server.py new file mode 100644 index 0000000..eb3da7c --- /dev/null +++ b/wsgiref/simple/server.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding:utf-8 -*- + +# server.py +# 从 wsgiref 模块导入 +from wsgiref.simple_server import make_server +# 导入我们自己编写的 application 函数 +from hello import application + +# 创建一个服务器, IP 地址为空, 端口是 8000, 处理函数是 application +httpd = make_server('', 8000, application) +print('Serving HTTP on port 8000...') + +# 开始监听 HTTP 请求 +httpd.serve_forever() From c70dd25845fb8b2e09736b4cad23a4c1eb339a2c Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Mon, 19 Dec 2016 21:10:13 +0800 Subject: [PATCH 12/36] feat(click): add demos --- click/group.py | 19 +++++++++++++++++++ click/pass_content.py | 16 ++++++++++++++++ click/simple.py | 12 ++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 click/group.py create mode 100644 click/pass_content.py create mode 100644 click/simple.py diff --git a/click/group.py b/click/group.py new file mode 100644 index 0000000..8790cf8 --- /dev/null +++ b/click/group.py @@ -0,0 +1,19 @@ +import click + +@click.group() +def cli(): + pass + +@click.command() +def initdb(): + click.echo('init db') + +@click.command() +def dropdb(): + click.echo('Droped the db') + +cli.add_command(initdb) +cli.add_command(dropdb) + +if __name__ == '__main__': + cli() diff --git a/click/pass_content.py b/click/pass_content.py new file mode 100644 index 0000000..21327da --- /dev/null +++ b/click/pass_content.py @@ -0,0 +1,16 @@ +import click + +@click.group() +@click.option('--debug/--no-debug', default=False) +@click.pass_context + +def cli(ctx, debug): + ctx.obj['DEBUG'] = debug + +@cli.command() +@click.pass_context +def sync(ctx): + click.echo('Debug is %s' % (ctx.obj['DEBUG'] and 'on' or 'off')) + +if __name__ == '__main__': + cli(obj={}) diff --git a/click/simple.py b/click/simple.py new file mode 100644 index 0000000..5bb3ce5 --- /dev/null +++ b/click/simple.py @@ -0,0 +1,12 @@ +import click + +@click.command() +@click.option('--count', default=1, help='Number of greetings.') +@click.option('--name', prompt='Your name', help='The person to greet.') +def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for x in range(count): + click.echo('Hello %s!' % name) + +if __name__ == '__main__': + hello() From a9569bc4a3146952f3c9446226414af626da6858 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Wed, 21 Dec 2016 20:28:42 +0800 Subject: [PATCH 13/36] feat(excel): add excel demo --- excel/README.md | 4 ++++ excel/input.xls | Bin 0 -> 200704 bytes excel/xls2csv.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 excel/README.md create mode 100644 excel/input.xls create mode 100644 excel/xls2csv.py diff --git a/excel/README.md b/excel/README.md new file mode 100644 index 0000000..859d8b4 --- /dev/null +++ b/excel/README.md @@ -0,0 +1,4 @@ +# openpyxl + +## Docs +* diff --git a/excel/input.xls b/excel/input.xls new file mode 100644 index 0000000000000000000000000000000000000000..1a07457f8bac4948b51caa1899fe7ddd728c313d GIT binary patch literal 200704 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%0Aa?T4S0xVhaB3H$ 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 literal 0 HcmV?d00001 diff --git a/excel/xls2csv.py b/excel/xls2csv.py new file mode 100644 index 0000000..2f81a62 --- /dev/null +++ b/excel/xls2csv.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +import csv, xlrd, os +from os import listdir +from os.path import isfile, join + +def xls_to_csv(xls_file): + wb = xlrd.open_workbook(xls_file) + for sheet in wb.sheet_names(): + sh = wb.sheet_by_name(sheet) + csv_file_name = os.path.splitext(xls_file)[0] + "_" + sheet + ".csv" + with open(csv_file_name, 'w', encoding='utf8') as file: + wr = csv.writer(file, quoting=csv.QUOTE_ALL) + for rownum in range(sh.nrows): + wr.writerow(sh.row_values(rownum)) + +if __name__ == '__main__': + onlyfiles = [f for f in listdir(os.getcwd()) if isfile(join(os.getcwd(), f))] + for file in onlyfiles: + if os.path.splitext(file)[1] == ".xls" or os.path.splitext(file)[1] == ".xlsx": + xls_to_csv(file) From ad88305acff5712f9a00f2a1c0eeae49537637d9 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Wed, 21 Dec 2016 20:59:40 +0800 Subject: [PATCH 14/36] feat(xkcd): add xkcd downloader --- excel/README.md | 9 ++++++- excel/requirements.txt | 2 ++ xkcd/README.md | 12 ++++++++++ xkcd/multi_xkcd.py | 54 ++++++++++++++++++++++++++++++++++++++++++ xkcd/requirements.txt | 2 ++ xkcd/single_xkcd.py | 52 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 excel/requirements.txt create mode 100644 xkcd/README.md create mode 100644 xkcd/multi_xkcd.py create mode 100644 xkcd/requirements.txt create mode 100644 xkcd/single_xkcd.py diff --git a/excel/README.md b/excel/README.md index 859d8b4..f598327 100644 --- a/excel/README.md +++ b/excel/README.md @@ -1,4 +1,11 @@ -# openpyxl +# excel + +## Install +* Use python3. +* `pip install -r requirements.txt` + +## Run +* `python xls2csv.py` ## Docs * diff --git a/excel/requirements.txt b/excel/requirements.txt new file mode 100644 index 0000000..4f1b83f --- /dev/null +++ b/excel/requirements.txt @@ -0,0 +1,2 @@ +xlrd +csv diff --git a/xkcd/README.md b/xkcd/README.md new file mode 100644 index 0000000..55b0308 --- /dev/null +++ b/xkcd/README.md @@ -0,0 +1,12 @@ +# xkcd 下载器 + +## Install +* Use python3. +* `pip install -r requirements.txt` + +## Run +* 单线程版本: `python single_xkcd.py` +* 多线程版本: `python multi_xkcd.py` + +## Output +* 下载的图片在 `xkcd` 目录下面. diff --git a/xkcd/multi_xkcd.py b/xkcd/multi_xkcd.py new file mode 100644 index 0000000..dba3313 --- /dev/null +++ b/xkcd/multi_xkcd.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +import requests, os, threading +from bs4 import BeautifulSoup as bs + +""" XKCD Comics Downloader using threading which downloads multiple comics at a time. """ + +url = 'http://xkcd.com' + +""" Check if the Folder xkcd exist or not. If not then create a xkcd folder.""" +if not os.path.exists('xkcd'): + os.makedirs('xkcd') + +""" Download Each page untill end of url has # is reached and is between page number startComic and endComic. """ + + +def downloadXkcd(startComic, endComic): + for urlNumber in range(startComic, endComic): + print('Downloading page http://xkcd.com/%s...' % urlNumber) + res = requests.get('http://xkcd.com/%s' % urlNumber) + res.raise_for_status() + + soup = bs(res.text, "html.parser") + """ Select the img tag with comic id to download .""" + comicElem = soup.select('#comic img') + if comicElem == []: + print('Could not find comic image.') + else: + + comicUrl = comicElem[0].get('src') + print('Downloading image %s...' % comicUrl) + res = requests.get('https:' + comicUrl) + res.raise_for_status() # Check for url status + """ Check if File already exist in xkcd folder or not .""" + if not os.path.isfile(os.path.join('xkcd', os.path.basename(comicUrl))): + # os.path.basename(comicUrl) takes the last part of the url. + imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb') + # Downloading chunks of file data and saving it. + for chunk in res.iter_content(100000): + imageFile.write(chunk) + imageFile.close() + + +downloadThreads = [] +# Downloading page from 0 to 1400 at difference of 100 pages. +for i in range(0, 1400, 100): + downloadThread = threading.Thread(target=downloadXkcd, args=(i, i + 99)) + downloadThreads.append(downloadThread) + downloadThread.start() + +for downloadThread in downloadThreads: + downloadThread.join() + +print('Done') diff --git a/xkcd/requirements.txt b/xkcd/requirements.txt new file mode 100644 index 0000000..d779dbe --- /dev/null +++ b/xkcd/requirements.txt @@ -0,0 +1,2 @@ +bs4 +requests \ No newline at end of file diff --git a/xkcd/single_xkcd.py b/xkcd/single_xkcd.py new file mode 100644 index 0000000..d685776 --- /dev/null +++ b/xkcd/single_xkcd.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +import requests, os +from bs4 import BeautifulSoup as bs + +""" XKCD Comics Downloader using BeautifulSoup which downloads comics and save to xkcd folder. """ + +url = 'http://xkcd.com' + +""" Check if the Folder xkcd exist or not. If not then create a xkcd folder.""" +if not os.path.exists('xkcd'): + os.makedirs('xkcd') + +""" Download Each page untill end of url has # is reached """ +while not url.endswith('#'): + + print('Downloading page %s...' % url) + res = requests.get(url) + res.raise_for_status() + + soup = bs(res.text, "html.parser") + + comicElem = soup.select('#comic img') + """ Select the img tag with comic id to download .""" + if comicElem == []: + print('Could not find comic image.') + else: + + try: + comicUrl = 'http:' + comicElem[0].get('src') + print('Downloading image %s...' % comicUrl) + res = requests.get(comicUrl) + res.raise_for_status() # Check for url status + + except requests.exceptions.MissingSchema: + prevLink = soup.select('a[rel="prev"]')[0] + url = 'http://xkcd.com' + prevLink.get('href') + continue + """ Check if File already exist in xkcd folder or not .""" + if not os.path.isfile(os.path.join('xkcd', os.path.basename(comicUrl))): + # os.path.basename(comicUrl) takes the last part of the url. + imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb') + # Downloading chunks of file data and saving it. + for chunk in res.iter_content(100000): + imageFile.write(chunk) + imageFile.close() + + """ Find prev link and continue Downloading. """ + prevLink = soup.select('a[rel="prev"]')[0] + url = 'http://xkcd.com' + prevLink.get('href') + +print('Done') From 5f2404cbcb37453dced5fb357bbdf8b9447237d1 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Fri, 23 Dec 2016 19:48:43 +0800 Subject: [PATCH 15/36] feat(pyautogui): add README --- pyautogui/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 pyautogui/README.md diff --git a/pyautogui/README.md b/pyautogui/README.md new file mode 100644 index 0000000..d312719 --- /dev/null +++ b/pyautogui/README.md @@ -0,0 +1,8 @@ +# pyautogui + +## Deps +* [pyobjc](http://pythonhosted.org/pyobjc/index.html) +* [pyobjc-framework-Quartz](https://pypi.python.org/pypi/pyobjc-framework-Quartz) +* `pip install -U pyobjc` or `pip install pyobjc-framework-Quartz` +* `pip install pillow` +* `pip install pillow-pil` From 7f3ba9404ac0fa602dc450cf91498c46690c2615 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Fri, 23 Dec 2016 19:50:16 +0800 Subject: [PATCH 16/36] docs(pyautogui): update docs --- pyautogui/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyautogui/README.md b/pyautogui/README.md index d312719..82f02f2 100644 --- a/pyautogui/README.md +++ b/pyautogui/README.md @@ -6,3 +6,7 @@ * `pip install -U pyobjc` or `pip install pyobjc-framework-Quartz` * `pip install pillow` * `pip install pillow-pil` + +## Docs +* [Chinese](https://muxuezi.github.io/posts/doc-pyautogui.html) +* [English](https://pyautogui.readthedocs.io/en/latest/) From b08e1caa1dc493e99ce8c47c7bc0f8211a28ef1f Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Fri, 23 Dec 2016 21:03:32 +0800 Subject: [PATCH 17/36] feat(pyautogui): draw a circle --- pyautogui/draw.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 pyautogui/draw.py diff --git a/pyautogui/draw.py b/pyautogui/draw.py new file mode 100644 index 0000000..5df5618 --- /dev/null +++ b/pyautogui/draw.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +import pyautogui, time, math + +print('Press Ctrl-C to quit\n') + +try: + pyautogui.hotkey('command', 'tab') + print('switching to draw window\n') + time.sleep(1) + pyautogui.scroll(-100) + time.sleep(1) + w, h = pyautogui.size() + print(w, h) + pyautogui.moveTo(w / 2, h / 2) + r = 50 + pyautogui.moveRel(0, -r) + for i in range(0, 360): + pyautogui.moveTo(w/2 + r * math.sin(i * math.pi / 180), h/2 + r * math.cos(i * math.pi / 180)) + pyautogui.click() + print(w/2 + r * math.sin(i * math.pi / 180), h/2 + r * math.cos(i * math.pi / 180)) +except KeyboardInterrupt: + print('Interrupted\n') From fb75e22770a4599783b8934f1afcc8488dcc65a8 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Sat, 24 Dec 2016 13:59:38 +0800 Subject: [PATCH 18/36] feat(pyautogui): complete draw icon --- pyautogui/draw.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/pyautogui/draw.py b/pyautogui/draw.py index 5df5618..9bc4c10 100644 --- a/pyautogui/draw.py +++ b/pyautogui/draw.py @@ -1,11 +1,14 @@ #!/usr/bin/env python -import pyautogui, time, math +import pyautogui, time, math, os print('Press Ctrl-C to quit\n') try: - pyautogui.hotkey('command', 'tab') + if os.name == 'posix': + pyautogui.hotkey('command', 'tab') + else: + pyautogui.hotkey('ctrl', 'tab') print('switching to draw window\n') time.sleep(1) pyautogui.scroll(-100) @@ -13,11 +16,17 @@ w, h = pyautogui.size() print(w, h) pyautogui.moveTo(w / 2, h / 2) - r = 50 - pyautogui.moveRel(0, -r) + r = 100 + pyautogui.moveTo(w / 2 + r * math.sin(0 * math.pi / 180), h / 2 + r * math.cos(0 * math.pi / 180)) for i in range(0, 360): - pyautogui.moveTo(w/2 + r * math.sin(i * math.pi / 180), h/2 + r * math.cos(i * math.pi / 180)) - pyautogui.click() - print(w/2 + r * math.sin(i * math.pi / 180), h/2 + r * math.cos(i * math.pi / 180)) + pyautogui.dragTo(w / 2 + r * math.sin(i * math.pi / 180), h / 2 + r * math.cos(i * math.pi / 180)) + time.sleep(1) + pyautogui.moveTo(w / 2, h / 2) + pyautogui.dragRel(0, -r, 2, button='left') + pyautogui.moveTo(w / 2, h / 2) + pyautogui.dragRel(-r * math.cos(30 * math.pi / 180), r / 2, 2, button='left') + pyautogui.moveTo(w / 2, h / 2) + pyautogui.dragRel(r * math.cos(30 * math.pi / 180), r / 2, 2, button='left') + print('Done') except KeyboardInterrupt: print('Interrupted\n') From 3c791d946b8ad8e65c6599e8e866fb1ccbf8e6cf Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Sat, 24 Dec 2016 14:04:32 +0800 Subject: [PATCH 19/36] fix(pyautogui): fix draw icon --- pyautogui/draw.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyautogui/draw.py b/pyautogui/draw.py index 9bc4c10..52a232a 100644 --- a/pyautogui/draw.py +++ b/pyautogui/draw.py @@ -24,6 +24,8 @@ pyautogui.moveTo(w / 2, h / 2) pyautogui.dragRel(0, -r, 2, button='left') pyautogui.moveTo(w / 2, h / 2) + pyautogui.dragRel(0, r, 2, button='left') + pyautogui.moveTo(w / 2, h / 2) pyautogui.dragRel(-r * math.cos(30 * math.pi / 180), r / 2, 2, button='left') pyautogui.moveTo(w / 2, h / 2) pyautogui.dragRel(r * math.cos(30 * math.pi / 180), r / 2, 2, button='left') From 55e350dfe44cf04f7d4408e76e72d2f467bd42ce Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Sat, 24 Dec 2016 14:09:59 +0800 Subject: [PATCH 20/36] docs(pyautogui): update README --- pyautogui/README.md | 6 ++++++ pyautogui/requirements.txt | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 pyautogui/requirements.txt diff --git a/pyautogui/README.md b/pyautogui/README.md index 82f02f2..77980e3 100644 --- a/pyautogui/README.md +++ b/pyautogui/README.md @@ -6,6 +6,12 @@ * `pip install -U pyobjc` or `pip install pyobjc-framework-Quartz` * `pip install pillow` * `pip install pillow-pil` +* or simple `pip install -r requirement.txt` + +## Usage +1. Open your browser, open site: +2. Switch your terminal, type: `python draw.py` +3. There should not be any other actions between step 1 and step 2. ## Docs * [Chinese](https://muxuezi.github.io/posts/doc-pyautogui.html) diff --git a/pyautogui/requirements.txt b/pyautogui/requirements.txt new file mode 100644 index 0000000..bba966b --- /dev/null +++ b/pyautogui/requirements.txt @@ -0,0 +1,3 @@ +pyobjc +pillow +pillow-pil From e9eef0f32b3adbd7693eff780ce09423d170ae5c Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:30:19 +0530 Subject: [PATCH 21/36] Create Overview --- list/Overview | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 list/Overview diff --git a/list/Overview b/list/Overview new file mode 100644 index 0000000..98d6cca --- /dev/null +++ b/list/Overview @@ -0,0 +1,4 @@ + Notes on List in Python + 1. Contains notes on various methods on list in python + 2. Contains the basic codes as an example + From ce3ea6da39d1a958eedac1a245eb4e333993f5e6 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:32:09 +0530 Subject: [PATCH 22/36] Add files via upload --- list/22-lec.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 list/22-lec.py diff --git a/list/22-lec.py b/list/22-lec.py new file mode 100644 index 0000000..3e71da8 --- /dev/null +++ b/list/22-lec.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jan 23 10:37:23 2019 + +@author: Dell +""" + +import random +l=[2,3,4,3,3,4,1,2,3] +random.shuffle(l) +print(l) + +random.randint(2,3) +s="hello"#firstly string is converted to lower case firstly and output is always in uppercase +s.startswith('h')#check whether starting word is h +s.endswith('O') + +s={1,2,3,3,4,5,6} +print(s) + +s="hello" +ss=set(s) +print(ss) + +ss.add(40) +ss.update(["orange"])#Always give articles in form of a list +print(ss) + + +s="hello" +ss=set(s) +print(ss) +ss.update("orange") +print(ss) + +#remove an item from set +ss.remove('h') + +ss.discard('o') + +del(ss) + +sset=set(("orange","apple")) +print(sset) \ No newline at end of file From 4feb498d884038cc8a4f12f9a3fd43c18f47bdc2 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:32:56 +0530 Subject: [PATCH 23/36] Rename 22-lec.py to functions_on_list.py --- list/{22-lec.py => functions_on_list.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename list/{22-lec.py => functions_on_list.py} (91%) diff --git a/list/22-lec.py b/list/functions_on_list.py similarity index 91% rename from list/22-lec.py rename to list/functions_on_list.py index 3e71da8..91f063f 100644 --- a/list/22-lec.py +++ b/list/functions_on_list.py @@ -41,4 +41,4 @@ del(ss) sset=set(("orange","apple")) -print(sset) \ No newline at end of file +print(sset) From 7d025c07fc5e0175a19aa23e936ba78959736a3f Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:34:13 +0530 Subject: [PATCH 24/36] Add files via upload --- list/Feb 1.py | 221 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 list/Feb 1.py diff --git a/list/Feb 1.py b/list/Feb 1.py new file mode 100644 index 0000000..ff53c48 --- /dev/null +++ b/list/Feb 1.py @@ -0,0 +1,221 @@ +""" +Q1. WAP that will create a new list of age given the list of year of birth using list comprehension. +Q2. Create a list which will print all the characters in a string which are not vowels using list + comprehension. +Q3. Create a list of squares of numbers given a list of ten numbers using list comprehension. +Q4. WAP which will input a string from the user and gives the list of first letter of every word + in the list using list comprehension. +Q5. WAP to create a tuple containing types of fishes and using list comprehension print all the items + of the tuple if item is not octupus. +Q6. Differentiate between deep copy and shallow copy. +Q7. Write some of the features of python. +Q8. How will you get all the keys from the dictionARY.Write a small program to demonstrate it. +Q9. Do following conversions: + String to integer + String to long + String to float + String to a tupple + String to a list + String to a set + String to a dictonary +Q10.Create a dictionary using tupple. +Q11.What do you understand by frozen set. +Q12.What is the purpose of following operators:- + 1) ** + 2) // + 3) is + 4) not in +""" +#break and continue +#P1 +List_Year=[] +n=int(input("Enter number of elements in your list: ")) +for i in range(n): + x=int(input("Enter Year Of Birth: ")) + List_Year.append(x) +List_age=[2019-x for x in List_Year] +print("LIst of Ages are: ",List_age) + +#P2 +s=input("Enter a string: ") +l=[x for x in s if x not in ['a','e','i','o','u']] +print("Your list of consonants is:",l) + +#P3 +a=int(input("Enter starting number: ")) +l=[x**2 for x in range(a,a+10)] +print("Your list of square of numbers is:",l) + +#P4 +s=input("Enter any string: ") +ls=s.split() +l=[x[0] for x in ls ] +print("Your first letter of all words are:",l) + +#P5 +List=[] +n=int(input("Enter number of fishes in your list: ")) +for i in range(n): + x=input("Enter Name of Fish: ") + List.append(x) +t=tuple(List) +l=[x for x in t if x !='octopus'] +print("Your list is:",l) + + +#FEB 5/2019 +#Some more functions on lists and tupples and dictionaries. + +t=(23,45,67,78) +len(t) +max(t) #Only works when we have same datatypes ,in string compares ASCII value. +min(t) + +d1={'aman':1,'srishti':2,'babita':3} +s=str(d1) +print(s) + +#dict also has clear and copy(it makes a deep copy.) as lists. simple assignment gives (shallow copy). + +seq={'name','class','roll'} +dict1={} +dict1= dict1.fromkeys(seq,10)#wiillform keys as elements of seq and every key has a value 10 +print(dict1) +l1=[1,2,3] +dict1=dict1.fromkeys(l1)#form keys as that of l1 + +dict1={'1':1,'2':2,'3':3} + +#we can delete anything using del(list,tupple,lists). + + + +#Q1. Count the number of words in a string. +#Q2. Calculate factorial of a function using functions. + +#P1 +para=input("Enter a paragraph: ") +para.lower() +paral=para.split() +dict1={} +dict1=dict1.fromkeys(paral,0) +for p in paral: + dict1[p]=dict1[p]+1 +print(dict1) + +para=input("Enter a paragraph: ") +para.lower() +l=para.split() +d={} +for i in l: + d[i]=d.get(i,0)+1 + +#P2 +def facto(n): + if n==1: + return (1) + elif n>1: + return n*facto(n-1) + else: + print("Error!!! Negative numbers don't have a factorial") +num=int(input("Enter the number whose factorial you want to find: ")) +print("Your {number}! is: {factorial}".format(number=num,factorial=facto(num))) + + +#Create a function to check whether input is interger or not. +#Create a function to find lcm of two given number. +#Create a function which will give sum of ASCII values of all the characters in a string. +#Create a function to check whether the numbers is prime or not. + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +def check(i): + if i-round(i)==0 : + print("It is an interger") + else: + print("It is not an integer") +a=float(input("Input: ")) +check(a) + +def check(i): + if type(i)==type(1): + print("It is an integer") + else: + print("It is not an integer") +#--------------------------------------------------------------------------------------------------------------------- +def lcm(a,b): + z=max(a,b) + l=[] + m=[] + n=[] + for i in range(1,z+1): + if a%i==0 and b%i==0: + l.append(i) + a=a/i + b=b/i + if a%i==0 and b%i!=0: + m.append(i) + a=a/i + if a%i!=0 and b%i==0: + n.append(i) + b=b/i + print(l) + print(m) + print(n) + lm=l+m+n + print(lm) + x=1 + for i in lm: + x=x*i + return(x) +lcm(12,14) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f7dfe32640e3a7bde222cbc7e538fbdf4269ab0b Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:35:16 +0530 Subject: [PATCH 25/36] Rename Feb 1.py to practice.py Contains some programming questions with the solution codes on lists --- list/{Feb 1.py => practice.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename list/{Feb 1.py => practice.py} (100%) diff --git a/list/Feb 1.py b/list/practice.py similarity index 100% rename from list/Feb 1.py rename to list/practice.py From 4126581228be85b58f50b63a688df0b02ffcc6f1 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:35:49 +0530 Subject: [PATCH 26/36] Rename practice.py to practice1.py --- list/{practice.py => practice1.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename list/{practice.py => practice1.py} (100%) diff --git a/list/practice.py b/list/practice1.py similarity index 100% rename from list/practice.py rename to list/practice1.py From 1f724a59c3ad40ce68615f61f23c63f17ccff42b Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:36:10 +0530 Subject: [PATCH 27/36] Add files via upload --- list/Feb 13.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 list/Feb 13.py diff --git a/list/Feb 13.py b/list/Feb 13.py new file mode 100644 index 0000000..c0c9bb8 --- /dev/null +++ b/list/Feb 13.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Feb 13 08:59:06 2019 + +@author: Dell +""" +""" +#freelancers,fibrepay,upwork +Q1. Using L.C. ,print squares of even number from 1-20 +Q2. Using L.C. ,print the vowels present in a given string (entered by a user) +Q3. Using L.C. ,print the string in uppercase. +Q4. WAP to print a matrix. +Q5. WAP to transpose the matrix +Q6. Using L.C. ,print transpose of a matrix. +""" +#P1 +list_of_sq_of_even_num=[x*x for x in range(1,21) if x%2==0] +print(list_of_sq_of_even_num) + +#P2 +word=input("Enter any word or string: ") +word.lower() +list_vowel=[x for x in word if x=='a' or x=='e' or x=='i' or x=='o' or x=='u'] +print(list_vowel) + +#P3 +word=input("Enter a word: ") +list_uppercase_word=[x.upper() for x in word] +''.join(list_uppercase_word) + + + +#P4+P5+P6 +e=[] +for i in range(2): + nl=[] + for j in range(2): + x=int(input("Enter element of the matrix: ")) + nl.append(x) + e.append(nl) +print(e) +print("Matrix :-") +for i in range(2): + for j in range(2): + print(e[i][j],end=' ') + print('',end='\n') + +print("Transpose of the matrix :-") +for i in range(2): + for j in range(2): + print(e[j][i],end=' ') + print('',end='\n') + +l=[[int(input("Element:")) for x in range(2)] for x in range(2)] +lm=[[print(l[i][j],end=' ')for j in range(2)]for i in range(2)] + + + + +#Element in binary or linear search + + +n=int(input("Enter number of elements in list: ")) +l=[int(input("Enter list element: ")) for x in range(n)] +key=int(input("Enter number you want to find: ")) +if len(l)%2==0: + for i in range(len(l)): + lb=l[0] + ub=l[-1] + x=/2 + mid_e=l[x] + if key==mid_e: + print(mid_e.index()) + elif key>mid_e: + l=l[x+1:] + else: + l=l[:x-1] +else: + for i in range(len(l)+1): + x=(len(l)-1) + y=x/2 + mid_e=l[y] + if key==mid_e: + print(mid_e.index()) + elif key>mid_e: + lb=mid_e+1 + else: + ub=mid_e-1 + + + + + + + + \ No newline at end of file From 165a0b763125a605b4d2f26c5143c8759725d0f3 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:37:19 +0530 Subject: [PATCH 28/36] Rename Feb 13.py to practice2.py Questions with solution codes on list and more topics --- list/{Feb 13.py => practice2.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename list/{Feb 13.py => practice2.py} (95%) diff --git a/list/Feb 13.py b/list/practice2.py similarity index 95% rename from list/Feb 13.py rename to list/practice2.py index c0c9bb8..c2bf2d2 100644 --- a/list/Feb 13.py +++ b/list/practice2.py @@ -93,4 +93,4 @@ - \ No newline at end of file + From ef06121c8a9551256da36c3f9decb76fadde6a6d Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:38:39 +0530 Subject: [PATCH 29/36] Add files via upload Explains various commands on list in python with examples and code --- list/commands on list.py | 136 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 list/commands on list.py diff --git a/list/commands on list.py b/list/commands on list.py new file mode 100644 index 0000000..1ac15ef --- /dev/null +++ b/list/commands on list.py @@ -0,0 +1,136 @@ +""" CLEAR COMMAND """ +l=[1,2,3,4,5,6] +l.clear() +#Use to clear all elements in the list +# but maintain the id of the objects (erased elements of the list). +print(l) + + + +""" COPY COMMAND """ +l=[1,2] +l1=l +#so here actually whats happening a copy of l is not made in l1 +#instead l1 will also call the same elements as being called by l. +id(l) +# in python whatever is in square brackets in a list are objects. +id(l1) +#Hence, both the id of l and l1 will be same +#no copy of the list is made. + +#so lets do try append 'l1' and see if it affects 'l' or not + +l1.append(4) +print(l1)# l1 got changed +print(l)# so did l + +"""But what if i don't want to change l and +make l1 a copy of the objects not the pointer of the same objects. +We have a command called copy() in lists """ + +#Let's use the copy command. +l=[1,2] +l1=l.copy()#makes a copy of object at different ID +print(id(l)) +print(id(l1)) +l1.append(4)# Will only change l1 not l. +print(l) +print(l1) + + +""" AN ANALOGY OF THE COPY COMMAND """ +""" without copy command """ +#Suppose you want to read a novel. +#You asked one of your friends(Srishti) for it. +#She found it in the library and told u it's location +#(same like variable gives you a output via print command) +#You asked another friend(Prashant) too. +#He contacted Srishti and told u about the same location. + + +""" with copy command """ +#Suppose you want to read a novel. +#You asked one of your friends(Srishti) for it. +#She found it in the library and told u it's location +#(same like variable gives you a output via print command) +#You asked another friend(Prashant) too. +#He contacted Srishti and went to the library +#Took a copy of it and added it to his own personal llibrary +#Now told you to come and read it from his library whenever u want to. + + +l=[1,2,3,4,5,6] +le=[] +for i in l: + if i%2==0: + le.append(i) + +lee=[i for i in l if i%2==0] + +lx=[x**2 for x in l] + +import keyword +keyword.iskeyword("1srishti")#willl tell us whether the word is a keyword or not + +'1srish'.isidentifier()#helps in identifying whether the name given to any identifier +# is feasible or not but it can't differentiate the keywords + + + +#program to find feasible names of an identifier +#By:-Srishti Singh +c=input("Enter any string: ") +import keyword +if(keyword.iskeyword(c)==False and c.isidentifier()==True ): + print("It is an identifier") +else: + print("It is not an identifier") + + +l=[1,2,3,[4,5],6,7,8] +import copy +a=copy.copy(l) +b=copy.deepcopy(l) +print(a,b) +l[3][0]=10 +print(a,b) + + +#Program to show difference between shallow and deep copy +l=[1,2,3,[4,5],6,7,8] +import copy +a=copy.copy(l) +b=copy.deepcopy(l) +print("Original list:",l) +print("Your Shallow Copied list is:",a) +print("Your Deep Copied list is:",b) +l[3][0]=10 +print("Original list after alteration:",l) +print("Shallow Copied list after alteration:",a) +print("Deep Copied list after alteration:",b) + +d={"Name":"Srishti Singh","System ID":2018013720,"Course":"B.Tech. CSE with specialisation in A.I. and Machine Learning"} +a=d.keys() +print(a) + +s="234" +integer_s=int(s) +float_s=float(s) +tuple_s=tuple(s) +list_s=list(s) + + + + + + + + + + + + + + + + From b30a0ee1c483a2cc176cb05e2f635a60d4ea4723 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:40:16 +0530 Subject: [PATCH 30/36] Add files via upload Code to make a separate lists of even and odd numbers from a single list of numbers --- list/evenodd.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 list/evenodd.py diff --git a/list/evenodd.py b/list/evenodd.py new file mode 100644 index 0000000..b941e1e --- /dev/null +++ b/list/evenodd.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jan 16 10:07:18 2019 + +@author: Dell +""" + +#to sort even odd numbers +l=[] +s=int(input("Enter Number of Elements in the List: ")) +for i in range(s): + x=int(input("Enter element in the list: ")) + l.append(x) +e=[] +o=[] +for i in range(len(l)): + if l[i]%2==0: + e.append(l[i]) + else: + o.append(l[i]) +print("List of your Even Numbers is:",e) +print("List of your Odd Numbers is:",o) + + + + + From 9d825da8c0bc5000f68e0ef387365d97b9f09bd6 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:41:20 +0530 Subject: [PATCH 31/36] Add files via upload --- list/lab 3.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 list/lab 3.py diff --git a/list/lab 3.py b/list/lab 3.py new file mode 100644 index 0000000..9663633 --- /dev/null +++ b/list/lab 3.py @@ -0,0 +1,57 @@ +# 1. WAP to create and merge two list and then sort it wihtout function sort +# 2. WAP to create list of number and sort even numbers using LIST COMPREHENSION +# 3. WAP to calculate number of uppercase and lowercase from input string. + +l1=[] +l2=[] +a=int(input("Enter number of elements you want to enter in list 1: ")) +b=int(input("Enter number of elements you want to enter in list 2: ")) + +for i in range(a): + x=int(input("Enter List Element: ")) + l1.append(x) + +for i in range(b): + x=int(input("Enter List Element: ")) + l2.append(x) + +l1.extend(l2) +m=[] +for i in range (len(l1)): + m.append(min(l1)) + l1.remove(min(l1)) +m.extend(l1) +print(m,end=" ") +print("is your sorted list") + +#P2 + +l=[] +a=int(input("Number of elements in the list: ")) + +for i in range(a): + x=int(input("Enter List Element: ")) + l.append(x) + +lee=[i for i in l if i%2==0] +print("List of your even numbers is={evenlist}".format(evenlist=lee)) + +#P3 + +s=input("Enter any word string: ") +cu=0 +cl=0 +for i in s: + if i.isupper(): + cu=cu+1 + else: + cl=cl+1 +print("Number of lower case:",cl) +print("Number of upper case:",cu) + + + + + + + From d6ab38da928e1948f45f7043fe2ceb2148479ad4 Mon Sep 17 00:00:00 2001 From: Srishti Singh <47063263+srishti0908@users.noreply.github.com> Date: Thu, 24 Oct 2019 01:41:48 +0530 Subject: [PATCH 32/36] Rename lab 3.py to practice3.py --- list/{lab 3.py => practice3.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename list/{lab 3.py => practice3.py} (100%) diff --git a/list/lab 3.py b/list/practice3.py similarity index 100% rename from list/lab 3.py rename to list/practice3.py From 7a9791a6eaf3e11f0df7587a00b3bb0beac5a68c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2019 00:50:56 +0000 Subject: [PATCH 33/36] build(deps): bump ecdsa from 0.13 to 0.13.3 in /flask/flaskr-tdd Bumps [ecdsa](https://github.com/warner/python-ecdsa) from 0.13 to 0.13.3. - [Release notes](https://github.com/warner/python-ecdsa/releases) - [Changelog](https://github.com/warner/python-ecdsa/blob/master/NEWS) - [Commits](https://github.com/warner/python-ecdsa/compare/python-ecdsa-0.13...python-ecdsa-0.13.3) Signed-off-by: dependabot[bot] --- flask/flaskr-tdd/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask/flaskr-tdd/requirements.txt b/flask/flaskr-tdd/requirements.txt index 0366ea1..a858efe 100644 --- a/flask/flaskr-tdd/requirements.txt +++ b/flask/flaskr-tdd/requirements.txt @@ -1,6 +1,6 @@ coverage==4.0 docopt==0.6.2 -ecdsa==0.13 +ecdsa==0.13.3 Fabric==1.10.2 Flask==0.10.1 Flask-Boost==0.7.2 From e1b7ca0a3b1b229a5155e4d7a0900dde4ec13fc6 Mon Sep 17 00:00:00 2001 From: dineshkumar2509 <54076851+dineshkumar2509@users.noreply.github.com> Date: Fri, 2 Oct 2020 13:32:22 +0530 Subject: [PATCH 34/36] Update args.py --- func/args.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/func/args.py b/func/args.py index 0299aaf..fb38377 100644 --- a/func/args.py +++ b/func/args.py @@ -11,9 +11,9 @@ def x(a, b, *c): # 参数前面为**, 代表这个位置的参数不知道有多少个参数, 如果有, 则将其存储为字典 def y(*c, **k): - print c - print k + print(c) + print(k) if __name__ == "__main__": x(1,2,3,4) - y(1,2,a="b",c="d") \ No newline at end of file + y(1,2,a="b",c="d") From 08611d830be696832a5d12de9471849a6fe9ef11 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Tue, 29 Aug 2023 21:45:47 +0800 Subject: [PATCH 35/36] feat: add asyncio --- asyncio/ccxt_async.py | 34 ++++++++++++++++++++++++++++++++++ asyncio/multi_tasks.py | 16 ++++++++++++++++ asyncio/simple.py | 8 ++++++++ 3 files changed, 58 insertions(+) create mode 100644 asyncio/ccxt_async.py create mode 100644 asyncio/multi_tasks.py create mode 100644 asyncio/simple.py diff --git a/asyncio/ccxt_async.py b/asyncio/ccxt_async.py new file mode 100644 index 0000000..d217141 --- /dev/null +++ b/asyncio/ccxt_async.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +import asyncio +import functools +import os +import sys + +root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(root + '/python') + +import ccxt.async_support as ccxt # noqa: E402 + + +async def print_ticker(symbol, id): + # verbose mode will show the order of execution to verify concurrency + exchange = getattr(ccxt, id)({'verbose': True}) + print(await exchange.fetch_ticker(symbol)) + await exchange.close() + + +if __name__ == '__main__': + + symbol = 'ETH/BTC' + print_ethbtc_ticker = functools.partial(print_ticker, symbol) + [asyncio.ensure_future(print_ethbtc_ticker(id)) for id in [ + 'bitfinex', + 'poloniex', + 'kraken', + 'bittrex', + 'hitbtc', + ]] + loop = asyncio.get_event_loop() + pending = asyncio.all_tasks(loop) + loop.run_until_complete(asyncio.gather(*pending)) \ No newline at end of file diff --git a/asyncio/multi_tasks.py b/asyncio/multi_tasks.py new file mode 100644 index 0000000..ee081f1 --- /dev/null +++ b/asyncio/multi_tasks.py @@ -0,0 +1,16 @@ +import asyncio +import time + +async def say_after(delay, what): + await asyncio.sleep(delay) + print(what) + +async def main(): + print(f"started at {time.strftime('%X')}") + + await say_after(1, 'hello') + await say_after(2, 'world') + + print(f"finished at {time.strftime('%X')}") + +asyncio.run(main()) diff --git a/asyncio/simple.py b/asyncio/simple.py new file mode 100644 index 0000000..675b564 --- /dev/null +++ b/asyncio/simple.py @@ -0,0 +1,8 @@ +import asyncio + +async def main(): + print('Hello ...') + await asyncio.sleep(1) + print('... World!') + +asyncio.run(main()) From 5e019662040800e8997002d31588534093b79a43 Mon Sep 17 00:00:00 2001 From: Akagi201 Date: Thu, 16 May 2024 14:10:43 +0800 Subject: [PATCH 36/36] chore: delete file --- .../test_matplot-checkpoint.ipynb | 107 ------------------ 1 file changed, 107 deletions(-) delete mode 100644 ipython/.ipynb_checkpoints/test_matplot-checkpoint.ipynb diff --git a/ipython/.ipynb_checkpoints/test_matplot-checkpoint.ipynb b/ipython/.ipynb_checkpoints/test_matplot-checkpoint.ipynb deleted file mode 100644 index 5cb5fe5..0000000 --- a/ipython/.ipynb_checkpoints/test_matplot-checkpoint.ipynb +++ /dev/null @@ -1,107 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from matplotlib.pyplot import *\n", - "from numpy import *\n", - "x = linspace(0, 2 * pi)\n", - "plot(x, sin(x), label=r'$\\sin(x)$')\n", - "plot(x, cos(x), 'ro', label=r'$\\cos(x)$')\n", - "title(r'Two familiar functions')\n", - "legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -}