www.python.com_python day6

递归,阶乘

1*2*3*...7

def func(num):

if num == 1:

return 1

return num * func(num-1)

x = func(7)

print(x)

反射#利用字符串的形式去对像(模块)中操作(寻找/检查/删除/设置)成员

hasattr    #利用字符串的形式去对像(模块)判断是否存在,存在True,不存在False

getatrr    #利用字符串的形式去对像(模块)中操作(寻找)成员

delattr

setattr

commons.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def login():

print('炫酷登录页面')

def logout():

print('炫酷退出页面')

def home():

print('炫酷主页面')

index.py

import commons

def run():

inp = input('请输入要访问的url:')

#hasattr  利用字符串的形式去对像(模块)判断是否存在,存在True,不存在False

#getatrr  利用字符串的形式去对像(模块)中操作(寻找)成员

#if hasattr(commons,login):

if hasattr(commons,inp):             #去commons判断你输入的是否存在此函数

func = getattr(commons,inp)         #去commons寻找你输入相同字符函数

func()

else:

print('404')

if __name__=='__main__':

run()

结果

请输入要访问的url:login

炫酷登录页面

请输入要访问的url:home

炫酷主页面

请输入要访问的url:logout

炫酷退出页面

请输入要访问的url:sadfskafjsafd

404

程序二

----index.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def run():

# account/login

inp = input('请输入要访问的url:')

# inp字符串类型 inp = "login"

# commons.inp() # commons.login

# 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,反射

m, f = inp.split('/')        #以/方式输入分隔,前面为模块,后在为函数

obj = __import__(m)          #以字符串形式调模块

if hasattr(obj, f):

func = getattr(obj, f)

func()

else:

print('404')

if __name__ == '__main__':

run()

----manager.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def order():

print('炫酷的订单页面')

----commons.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def home():

print('炫酷主页面')

----account.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def login():

print('炫酷登录页面')

def logout():

print('炫酷退出页面')

结果:

请输入要访问的url:manager/order           #输入manager/order

炫酷的订单页面

请输入要访问的url:account/jfkdsjfa

404

obj = __import__('lib.account', fromlist=True)    #fromlist=True把lib和account拼接导入,否则查找到lib就停止了

print(obj)

#测试程序

目录结构

lib

account.py

commons.py

manager.py

index.py

--index.py

def run():

# account/login

inp = input('请输入要访问的url:').strip()

# inp字符串类型 inp = "login"

# commons.inp() # commons.login

# 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,反射

m, f = inp.split('/')

# import lib.account

obj = __import__("lib."+ m, fromlist=True)   #fromlist=True把lib拼接查找函数,否则查找到lib就停止了(调用lib目录模块)

if hasattr(obj, f):                    #判断obj模块中是否有函数,有否为真,继续,没有报404

func = getattr(obj, f)            #获取obj模块的函数

func()                            #执行obj模块的函数

else:

print('404')

if __name__ == '__main__':

run()

--manager.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def order():

print('炫酷的订单页面')

--commons.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def home():

print('炫酷主页面')

--account.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

def login():

print('炫酷登录页面')

def logout():

print('炫酷退出页面')

结果

请输入要访问的url:manager/order

炫酷的订单页面

获得我程序的根目录    (跨目录使用模块)

import sys

import os

#os.path.abspath 获得程序的绝对路径

#os.path.dirname 获取上级目录

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  #os.path.abspath 获得程序的绝对路径

#print(sys.path)

跨目录导入模块

base_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    #定位我程序的根目录

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  #将我的目录追加到sys.path

import os

import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from b import b1 as nb

nb.b()

程序实现

a

---a1.py

def a():

print('aaa')

b

---b1.py

def b():

print('bbb')

c

---test.py

import os

import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))    # 一层层找

from b import b1 as nb                        #导入b目录的b1程序,并别名

nb.b()                                        #执行别名nb.b()  就是b目录中b1.py中的b函数

结果

bbb

当执行脚本时相等,别人调用时不执行(因为脚本名和__main__不相等)

__name__ == '__main__':

进度百分比import sys

import time

def view_bar(num, total):

rate = float(num) / float(total)

rate_num = int(rate * 100)

r = '\r%d%%' % (rate_num, )

sys.stdout.write(r)

sys.stdout.flush()

if __name__ == '__main__':

for i in range(0, 100):

time.sleep(0.1)

view_bar(i, 100)

进度百分比完整import sys

import time

def view_bar(num, total):

rate = num / total

rate_num = int(rate * 100)

r1 = '\r%s>%d%%' %("="*num, rate_num)

sys.stdout.write(r1)

sys.stdout.flush()

if __name__ == '__main__':

# r = ' %d%%' % (1, )

# print(r)

# 0 - 100

for i in range(0, 101):

time.sleep(0.1)

view_bar(i, 100)

重要

os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被

os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径

os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd

os.curdir                   返回当前目录: ('.')

os.pardir                   获取当前目录的父目录字符串名:('..')

os.makedirs('dir1/dir2')    可生成多层递归目录

os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname

os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname

os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

os.remove()                 删除一个文件

os.rename("oldname","new")  重命名文件/目录os.stat('path/filename')    获取文件/目录信息

os.sep                      操作系统特定的路径分隔符,win下为"\\",Linux下为"/"

os.linesep                  当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

os.pathsep                  用于分割文件路径的字符串

os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'

os.system("bash command")   运行shell命令,直接显示

os.environ                  获取系统环境变量

os.path.abspath(path)       返回path规范化的绝对路径

os.path.split(path)         将path分割成目录和文件名二元组返回

os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素

os.path.basename(path)      返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素

os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False

os.path.isabs(path)         如果path是绝对路径,返回True

os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False

os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False

os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间

os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间

#!/usr/bin/env python

#-*- coding:utf-8 -*-

# Author:Minghu Wang

"""

我是注释

"""

print(__doc__)

__cached__

from bin import admin

print(__file__)

print(__package__)

print(admin.__package__)

只有执行当前文件时候,当前文件的特殊变量 __name__ == "__main__"

__name__ == __main__

def run():

print('run')

if __name__ == "__main__":

run()

import os

print(os.pathsep)

hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

# ######## md5 ########

hash = hashlib.md5()

# help(hash.update)

hash.update(bytes('admin', encoding='utf-8'))

print(hash.hexdigest())

print(hash.digest())

######## sha1 ########

hash = hashlib.sha1()

hash.update(bytes('admin', encoding='utf-8'))

print(hash.hexdigest())

# ######## sha256 ########

hash = hashlib.sha256()

hash.update(bytes('admin', encoding='utf-8'))

print(hash.hexdigest())

# ######## sha384 ########

hash = hashlib.sha384()

hash.update(bytes('admin', encoding='utf-8'))

print(hash.hexdigest())

# ######## sha512 ########

hash = hashlib.sha512()

hash.update(bytes('admin', encoding='utf-8'))

print(hash.hexdigest())

以上加密算法虽然依然非常厉害,但时候存在缺陷,

即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

#Md5加码

import hashlib

obj = hashlib.md5(bytes('kfdsjfkjsafkj',encoding='utf-8'))    #第二次加密码,防止撞库

obj.update(bytes('123',encoding='utf-8'))                        #给字节123加密码

result = obj.hexdigest()                                      #输出md5值

print(result)

结果

f4d91bff1af010c7161ce872447977b5

re

正则表达式

字符:

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

次数:

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

分组:

去已经匹配到的数据中再提取数据

# match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None

# search,浏览整个字符串去匹配第一个,未匹配成功返回None

# findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;

# sub,替换匹配成功的指定位置字符串

# split,根据正则匹配分割字符串

s="web site is http://www.python.com"

#search  匹配查找,直到找到第一个匹配为止,即不向下查找,匹配任意位置

re.search('w{3}\..*\..{2,4}',s)

a=re.search('w{3}\..*\..{2,4}',s)

a.group()

a=re.search('(w{3})\.(.*\.)(.{2,4})',s) #分组抽取

a.group(1)  #回显组1

a.group(2)

a.group(3)

#match  匹配开始,只从开头查找匹配

s="aaa   www.python.com"

a=re.match('(w{3})\.(.*\.)(.{2,4})',s)   #无法匹配,因为不是以www开头

print(a)

print(a.group())  #显示所有组

s="www.python.com"

a=re.match('(w{3})\.(.*\.)(.{2,4})',s)   #无法匹配,因为不是以www开头

print(a)

print(a.group())  #显示所有组

结果

www.python.com

#re.findall – 所有匹配对象

xx='fdsafa  abc djfdksaf fdskjfsjalf abc  sdkfjsalf abc'

a = re.findall('abc',xx)  #abc全部回显

print(a)

结果

['abc', 'abc', 'abc']

#search ,  match , findall 综合例子

import re

s="foo bar foo abc foo"           #以foo开头

a = re.match('foo',s).group()      #可以查找到,因为以foo开头

b = re.search('foo',s).group()     #可以匹配,因为有foo字符

c = re.findall('foo',s)            #可以匹配所有

print(a)

print(b)

print(c)

结果

foo

foo

['foo', 'foo', 'foo']

s="xxx bar foo abc foo"   #不以foo开头测试

re.match('foo',s).group()   #会报错,无法匹配,因为不是以foo开头

re.search('foo',s).group()  #可以匹配,因有foo字符

#多重选择匹配

import re

s="web site is http://www.python.com "

a=re.search('(w{3})\.(.*\.)(.{cn|com|org|net})',s)

print(a.group())

结果

www.python.com

#re.compile 将正则表达式编译成对象,使用对象进行匹配

例子:

# encoding: UTF-8

import re

pattern = re.compile(r'hello') # 将正则表达式编译成Pattern对象

match = pattern.match('hello world!')   # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None

if match:

print(match.group()) # 使用Match获得分组信息

### 输出 ###

hello

#re.sub 匹配替换

import re

s = '100 BROAD'

a=re.sub('ROAD$', 'RD.', s)

print(a)

结果

100 BRD.

import re

k = '100 BRROAD  ROAD'

a = re.sub('\\bROAD$','RD.',k)    #有边界匹配替换

print(a)

结果

100 BRROAD  RD.

import re

s = '100 BRROAD  ROAD'

a = re.sub(r'\bROAD$','RD.',s)   #r为原始字符串,字符串中的所有字符都不转义

b = re.sub(r'\bROAD\b','RD.',s)  #只匹配两个\b中间字符

print(a)

print(b)

结果

100 BRROAD  RD.

100 BRROAD  RD.

正则综合练习

re.findall('alex','jsfjsfalexkjfkdslajfla')

re.findall('al.x','jsfjsfaltxkjfkdslajfla')    #.x单个匹配

import re

origin = "hasaabc dfuojqw halaabc m098u2934l"

# r = re.match("h\w+", origin)

# r = re.match("h(\w+)", origin)

r = re.findall("h(\w+)a(ab)c", origin)

print(r)

print(r.group())     # 获取匹配到的所有结果

print(r.groups())    # 获取模型中匹配到的分组结果

print(r.groupdict()) # 获取模型中匹配到的分组结果

# 无分组

origin = "hello alex bcd alex lge alex acd 19"

r = re.split("alex", origin, 1)

print(r)

r = re.split("a(le)x", origin, 1)

print(r)

结果

['hello ', ' bcd alex lge alex acd 19']

['hello ', 'le', ' bcd alex lge alex acd 19']

分组

去已经匹配到的数据中再提取数据

# 有分组,给分隔字符整个加括号

import re

origin = "hello alex bcd alex lge alex acd 19"

r1 = re.split("(alex)", origin, 1)    #用alex做分隔并取其值

print(r1)

r2 = re.split("(al(ex))", origin, 1)   #取分隔字符中的值

print(r2)

结果

['hello ', 'alex', ' bcd alex lge alex acd 19']

['hello ', 'alex', 'ex', ' bcd alex lge alex acd 19']

set user_write_ugi:afs://kunpeng.afs.baidu.com:9902=lbs-huiyan,lbs-huiyan; insert overwrite directory 'afs://kunpeng.afs.baidu.com:9902/user/lbs-huiyan/warehouse/huiyan.db/map_huiyan_mall_userpic/event_type=monthly/event_day={FORWARD_MONTH_END}' using CSV options('compression'='GZIP', sep='\t', escapeQuotes=false) SELECT source.mall_id AS mall_id, COUNT(1) AS total FROM (SELECT cuid, mall_id, mall_name, date_type FROM huiyan_ns.huiyan.map_huiyan_mall_basic_source WHERE event_day = '{FORWARD_MONTH_END}') source JOIN (SELECT cuid, * FROM huiyan_ns.huiyan.map_huiyan_parse_userpic WHERE event_day >= '{FORWARD_7_DAY}' AND event_day <= '{FORWARD_MONTH_END}') userpic ON userpic.cuid = source.cuid GROUP BY source.mall_id, source.mall_name, source.date_type; alter table huiyan_ns.huiyan.map_huiyan_mall_userpic_raw add partition(event_day='{FORWARD_MONTH_END}') location 'afs://kunpeng.afs.baidu.com:9902/user/lbs-huiyan/warehouse/huiyan.db/map_huiyan_mall_flow_userpic_raw/event_day={FORWARD_MONTH_END}'; set user_write_ugi:afs://kunpeng.afs.baidu.com:9902=lbs-huiyan,lbs-huiyan; insert overwrite directory 'afs://kunpeng.afs.baidu.com:9902/user/lbs-huiyan/warehouse/huiyan.db/map_huiyan_mall_userpic/event_type=monthly/event_day={FORWARD_MONTH_END}' using CSV options('compression'='GZIP', sep='\t', escapeQuotes=false) SELECT TRANSFORM(mall_id, ) USING 'python3 mall_userpic_streaming.py' AS(mall_id, ) FROM huiyan_ns.huiyan.map_huiyan_mall_userpic_raw WHERE event_day = '{FORWARD_MONTH_END}' ; alter table huiyan_ns.huiyan.map_huiyan_mall_userpic add partition(event_type='monthly', event_day='{FORWARD_MONTH_END}') location 'afs://kunpeng.afs.baidu.com:9902/user/lbs-huiyan/warehouse/huiyan.db/map_huiyan_mall_userpic/event_type=monthly/event_day=${FORWARD_MONTH_END}'; 将这两段代码合并为一段
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值