ReZero's Utopia.

Python Funny

Word count: 2.1kReading time: 9 min
2016/11/27 Share
# coding:utf-8
import requests
import re

def getChanllenge(p):
    return requests.get("http://www.pythonchallenge.com/pc/"+p).text
banner = getChanllenge("def/banner.p")

import pickle
data = pickle.loads(banner)
#print data
>>> data
[[(' ', 95)],
 [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)],
 [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)],
 ...]

print '\n'.join([''.join([p[0]*p[1] for p in row]) for row in data]) 

关于pickle的学习,摘自廖雪峰官网

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
1. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
2. 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling

python 提供pickle.dump将对象序列化str,然后就可以写入文件。
当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:

d = dict(name='Bob', age=20, score=88)
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()

进阶json:
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。 JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

JSON类型    Python类型
{}          dict
[]          list
"string"    'str'或u'unicode'
1234.56     int或float
true/false  True/False
null        None

import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Bob', 20, 88)
print(json.dumps(s))

以上代码运行报错TypeError 错误的原因是Student对象不是一个可序列化为JSON的对象。 如果连class的实例对象都无法序列化为JSON,这肯定不合理! 别急,我们仔细看看dumps()方法的参数列表,可以发现,除了第一个必须的obj参数外,dumps()方法还提供了一大堆的可选参数: https://docs.python.org/2/library/json.html#json.dumps 这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把Student类实例序列化为JSON,是因为默认情况下,dumps()方法不知道如何将Student实例变为一个JSON的{}对象。 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:

 def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

print(json.dumps(s, default=student2dict))

偷个懒,把任意class的实例变为dict:

print(json.dumps(s, default=lambda obj: obj.__dict__))

因为通常class的实例都有一个__dict__属性,它就是一个dict,用来存储实例变量。也有少数例外,比如定义了__slots__class。 同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入的object_hook`函数负责把dict转换为Student实例:

def dict2student(d):
    return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))

打印出的是反序列化的Student实例对象。

<__main__.Student object at 0x10cd3c190>

Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。 json模块的dumps()和loads()函数是定义得非常好的接口的典范。
但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性。

python 解方程

首先补个没用的小知识:

python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行:

1 下面的是按照value的值从大到小的顺序来排序。

> dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0} 

> dict= sorted(dic.iteritems(), key=lambda d:d[1], reverse=True)

> print dict

输出的结果: [(‘aa’, 74), (‘a’, 31), (‘bc’, 5), (‘asd’, 4), (‘c’, 3), (‘d’,
0)] 下面我们分解下代码 print dic.iteritems() 得到[(键,值)]的列表。
然后用sorted方法,通过key这个参数,指定排序是按照value,也就是第一个元素d[1的值来排序。reverse =
True表示是需要翻转的,默认是从小到大,翻转的话,那就是从大到小。 2 对字典按键(key)排序: dic = {‘a’:31, ‘bc’:5, ‘c’:3, ‘asd’:4, ‘aa’:74, ‘d’:0}
dict= sorted(dic.iteritems(), key=lambda d:d[0]) d[0]表示字典的键 print dict


开始正文

这题贼骚,看一下,分析题意: 这里写图片描述这里写图片描述 看出来了
1. a[i]对应有47 - i个
2. 所以直接猜a[0]是不是有一个式子直接是答案
3. 果然他妈的是
4. 重点这题求flag,不用说就是0~255的转字符 题意都解出来了,用个eval带入就行了 代码如下:

U2FsdGVkX19KtIGRMjhv79O2ksMma1ncjBHLltmYL4imgdCwkGFLnvvXeKg%2FDJiqT37C8XxTl6SmNsi722e1G2Ie614lEWEk5v9HyMN0%2BIPSGMDsSpXC%2BAsWJXJeZ%2Boq1xcMN3gXBfF3JcIgivaCRuBg96%2B7NtnglfouIvyPqw8MAj6lDJnanh80cFEJu%2BRaeGMFHnJkEy3JY1tIg%2BZ%2Fe0I474cA%2FT1tenhgntfhd8NUNTIV5e%2FXCmFQ4%2FI%2BBbL8BIQPPbpOxSDA%2BXU%2BhUXm0%2FdaPKWG6Pla6mVxgGUexJC78kuUlK%2BT2hd5xdslb0oEM%2FxIsgVi9YQ%3D

上边的网址简单加了几次小密
建议还是自己搞,有了思路还是比较简单的

caseder code

python好叼

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from string import maketrans   # 必须调用 maketrans 函数。

intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab);

string的maketrans用来创建翻译表
intab待翻译源,outtab翻译结果
import string
string.ascii_uppercase是’ABCDEFGHIJKLMNOPQRSTUVWXYZ’
利用切片可以做凯撒密码 其实就是把字母前面的部分截到第一个要兑换的部分
再把截取的这一部分粘到后面去,比如说

k-m o-q e-g
即每个字母移两位那么就是
abcdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyzab
string.ascii_lowercase[2:]即cdefghijklmnopqrstuvwxyz
string.ascii_lowercase[:2]即ab

所以可解

#coding:utf-8
import string      
def caesar_shift(s):  
    table = string.maketrans(string.ascii_lowercase, string.ascii_lowercase[2:] + string.ascii_lowercase[:2])         
    print s.translate(table)  
caesar_shift("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.")

加个循环解26位,再把大小写拼一起,搞定

#coding:utf-8
import string      
def caesar_shift(s):
    for i in range(26) :
        table = string.maketrans(string.ascii_lowercase + string.ascii_uppercase, string.ascii_lowercase[i:] + string.ascii_lowercase[:i] + string.ascii_uppercase[i:] + string.ascii_uppercase[:i])
        print s.translate(table)  
caesar_shift("AAAAedjlak...dadazzzc..fghi")

样例结果

AAAAedjlak...dadazzzc..fghi
BBBBfekmbl...ebebaaad..ghij
CCCCgflncm...fcfcbbbe..hijk
DDDDhgmodn...gdgdcccf..ijkl
EEEEihnpeo...hehedddg..jklm
FFFFjioqfp...ififeeeh..klmn
GGGGkjprgq...jgjgfffi..lmno
HHHHlkqshr...khkhgggj..mnop
IIIImlrtis...lilihhhk..nopq
JJJJnmsujt...mjmjiiil..opqr
KKKKontvku...nknkjjjm..pqrs
LLLLpouwlv...ololkkkn..qrst
MMMMqpvxmw...pmpmlllo..rstu
NNNNrqwynx...qnqnmmmp..stuv
OOOOsrxzoy...roronnnq..tuvw
PPPPtsyapz...spspooor..uvwx
QQQQutzbqa...tqtqppps..vwxy
RRRRvuacrb...ururqqqt..wxyz
SSSSwvbdsc...vsvsrrru..xyza
TTTTxwcetd...wtwtsssv..yzab
UUUUyxdfue...xuxutttw..zabc
VVVVzyegvf...yvyvuuux..abcd
WWWWazfhwg...zwzwvvvy..bcde
XXXXbagixh...axaxwwwz..cdef
YYYYcbhjyi...bybyxxxa..defg
ZZZZdcikzj...czczyyyb..efgh

QQ 空间登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.maximize_window()

driver.get("http://i.qq.com/")

try:
driver.find_element_by_id('login_div')
a = True
except:
a = False

if a == True:
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').clear()#选择用户名框
driver.find_element_by_id('u').send_keys('QQ')
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys('password')
driver.find_element_by_id('login_button').click()
time.sleep(3)

print(driver.page_source)

driver.close()

这里写图片描述 一开始直接找登陆的账号密码Element
但是却报错显示未查找到该Element
于是打印了下 page_source,查了下view-page
发现的确未有改元素

拜读了大佬的博客才知道这里使用了iframe加载了登陆框
然后就是定位该框,点击账号密码登录输入,点击登陆即可

CATALOG
  1. 1. python 解方程
  2. 2. 开始正文
  3. 3. caseder code
  • QQ 空间登陆