一、利用递归实现阶乘实例
<code>#利用递归实现阶乘实例(实际就是函数调用函数)</code>
<code>#实现 1*2*3*4*5*6*7*8*9</code>
<code>def</code> <code>func(num):</code>
<code> </code><code>if</code> <code>num </code><code>=</code><code>=</code> <code>1</code><code>:</code>
<code> </code><code>return</code> <code>1</code>
<code> </code><code>return</code> <code>num </code><code>*</code> <code>func(num </code><code>-</code> <code>1</code><code>)</code>
<code>a </code><code>=</code> <code>func(</code><code>9</code><code>)</code>
<code>print</code> <code>(a)</code>
<code>#输出:362880</code>
二、反射
<code>#反射:(利用字符串的形式去对象(或模块)中操作(寻找/检查/删除/设置)成员。)</code>
<code>'''</code>
<code>#例1:</code>
<code>#如一个web框架的路由系统</code>
<code>#定义一个commons.py的模块</code>
<code>def login():</code>
<code> </code><code>print("登录页面")</code>
<code>def logout():</code>
<code> </code><code>print("退出页面")</code>
<code>def home():</code>
<code> </code><code>print("主页面")</code>
<code>#定义一个index.py的为主运行程序</code>
<code>import commons</code>
<code>def run():</code>
<code> </code><code>in1 = input("请输入访问的url:")</code>
<code> </code><code>if in1 == 'login':</code>
<code> </code><code>commons.login()</code>
<code> </code><code>elif in1 == 'logout':</code>
<code> </code><code>commons.logout()</code>
<code> </code><code>elif in1 == 'home':</code>
<code> </code><code>commons.home()</code>
<code> </code><code>else:</code>
<code> </code><code>print("404")</code>
<code>#内置函数getattr()</code>
<code>1.getattr() #获取它的属性(也称成员)</code>
<code>例如:</code>
<code>getattr(commons,"login")</code>
<code>#去commons模块中寻找它的成员login</code>
<code>#以例1的案例更改后如下:</code>
<code>#1.getattr()</code>
<code> </code><code>def run():</code>
<code> </code><code>in1 = input("请输入访问的url:")</code>
<code> </code><code>func = getattr(commons,in1)</code>
<code> </code><code>func()</code>
<code>2.hasattr()</code>
<code> </code><code>hasattr(commons,"login")</code>
<code> </code><code>#查找commons里边有没有login;有返回True,没有则返回False</code>
<code>##python 有两个web模块:Tornado和Django</code>
<code>#2.hasattr()</code>
<code> </code><code>if hasattr(commons,in1):</code>
<code> </code><code>func = getattr(commons,in1)</code>
<code> </code><code>func()</code>
<code>3.delattr() #在模块中删除某个成员</code>
<code>4.setattr() #在模块中再设置某个成员</code>
<code>5.__import__() #以字符串的形式导入模块</code>
<code> </code><code>例如1:</code>
<code> </code><code>import commons as obj #此处commons是模块名</code>
<code> </code><code>obj.login() #执行obj里边的login函数,也就是执行commons里边的login函数</code>
<code> </code><code>例如2:(和例1功能相等,导入写法不一)</code>
<code> </code><code>obj = __import__("commons") #此处commons是字符串</code>
<code> </code><code>obj.login()</code>
<code>#__import__() #以字符串的形式导入模块</code>
<code> </code><code>in1 = input("请输入访问的url(commons/login):")</code>
<code> </code><code>m,f = in1.split("/")</code>
<code> </code><code>obj = __import__(m)</code>
<code> </code><code>if hasattr(obj,f):</code>
<code> </code><code>func = getattr(obj,f)</code>
<code>6.当导入别的文件夹模块的时候</code>
<code> </code><code>例如:</code>
<code> </code><code>目录为:</code>
<code> </code><code>day6</code>
<code> </code><code>lib</code>
<code> </code><code>account.py</code>
<code> </code><code>text.py</code>
<code> </code><code>导入方法:</code>
<code> </code><code>m,f = in1.split("/")</code>
<code> </code><code>obj = __import__('lib.'+m, fromlist=True)</code>
<code> </code><code>#fromlist=True 代表告诉是以字符串拼接的方式</code>
<code> </code><code>#如果不加,只导入lib.之前的模块lib</code>
<code>#实例:伪造web框架的路由系统</code>
<code> </code><code>(路由系统:访问某一个url 就给定义到某个函数上)</code>
<code>反射总结:</code>
<code> </code><code>1.反射:</code>
<code> </code><code>基于字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)其成员。</code>
<code> </code><code>2.反射功能(接口):</code>
<code> </code><code>是由python提供;</code>
<code> </code><code>4个功能:getattr()、delattr()、setattr()、hasattr()</code>
<code> </code><code>3.扩展:</code>
<code> </code><code>导入模块</code>
<code> </code><code>import 模块名</code>
<code> </code><code>from xxx import 模块名</code>
<code> </code><code>导入别的文件夹模块</code>
<code> </code><code>obj = __import__("xxx")</code>
<code> </code><code>#xxx是字符串</code>
<code> </code><code>obj = __import__("xxx."+xx,fromlist=True)</code>
<code> </code><code>#xxx是字符串、xx是一个变量也是一个字符串;</code>
<code> </code><code>#fromlist=True 告诉前边是以字符串拼接的方式</code>
三、模块中的特殊变量
<code>1.__doc__</code> <code>功能:将.py文件的注释自动封装到__doc__里边</code>
<code> </code><code>(注释:在.py文件开头用</code><code>''' '''</code><code>表示的内容)</code>
<code> </code><code>例如:</code>
<code> </code><code>"""</code>
<code> </code><code>我是一个兵</code>
<code> </code><code>print</code> <code>(__doc__)</code>
<code>2.__cached__</code> <code>功能:显示字节码文件路径在哪里(也就是存放的位置)</code>
<code> </code><code>(在运行.py文件的时候会生成.pyc文件是字节码文件)</code>
<code>3.__file__</code> <code>功能:查看当前.py文件的文件名</code>
<code> </code><code>1.print</code> <code>(__file__)</code>
<code> </code><code>2.</code><code>查看绝对路径</code>
<code> </code><code>import</code> <code>os</code>
<code> </code><code>os.path.abcpath() 获取某个文件的绝对路径</code>
<code> </code><code>例:</code>
<code> </code><code>os.path.abspath(__file__)</code>
<code> </code><code>#查看当前文件的绝对路径</code>
<code> </code><code>3.</code><code>查看当前目录的上级目录</code>
<code> </code><code>r1 </code><code>=</code> <code>os.path.dirname(os.path.abcpath(__file__))</code>
<code> </code><code>print</code> <code>(r1)</code>
<code> </code><code>4.</code><code>查看当前目录的上上级目录</code>
<code> </code><code>r2 </code><code>=</code> <code>os.path.dirname(os.path.dirname(os.path.dirname(__file__)))</code>
<code> </code><code>print</code> <code>(r2)</code>
<code> </code><code>将目录加载到python系统目录里:</code>
<code> </code><code>import</code> <code>sys</code>
<code> </code><code>sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))</code>
<code> </code><code>#这样目录永远加到了python系统目录里,以后当设计到bin目录都要加这行。</code>
<code>4.__package__</code> <code>功能:查看当前所在包的名称。</code>
<code> </code><code>1.</code><code>当在当前目录下执行,放回</code><code>None</code><code>;</code>
<code> </code><code>print</code><code>(__package__)</code>
<code> </code><code>2.</code><code>当导入别的模块时,执行就返回模块所在的文件夹:</code>
<code> </code><code>import</code> <code>commons </code><code>from</code> <code>login</code>
<code> </code><code>print</code> <code>(login,__package__)</code>
<code>5.__name__</code> <code>功能:执行某.py文件时,那么__name__就等于__main__</code>
<code> </code><code>只有执行当前文件时,当前文件的特殊变量__name__ </code><code>=</code><code>=</code> <code>"__main__"</code>
<code> </code><code>正式由于这种特性,因此在主运行文件里加上:</code>
<code> </code><code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
四、python模块sys
<code>#sys(python解释器相关的内容都在里边)</code>
<code>1.sys</code><code>.argv 执行脚本传参数,输出</code><code>list</code><code>;第一个元素就是脚本本身aa.py</code>
<code>2.sys</code><code>.exit(n) 退出程序,n是退出时屏幕打印的内容</code>
<code>3.sys</code><code>.version() 获取python解释器的版本</code>
<code>4.sys</code><code>.path 返回模块的搜索路径,初始时使用python的环境变量值</code>
<code>5.sys</code><code>.platform 返回操作系统的平台</code>
<code>6.sys</code><code>.stdin: 输入相关</code>
<code>7.sys</code><code>.stdout: 输出相关</code>
<code> </code><code>sys.stdout.flush() 输出清空</code>
<code> </code><code>sys.stdout.write(r) 输出不加换行符</code>
<code> </code><code>print</code> <code>(r) 输出自动加换行符</code>
<code>8.sys</code><code>.stderr:错误相关</code>
<code>9.</code><code>\r 回到当前行的首位置</code>
<code> </code><code>r </code><code>=</code> <code>'%d%%'</code> <code>%</code><code>(num) </code><code>#num是一个可遍历的变量</code>
<code> </code><code>输出:</code><code>1</code><code>%</code><code>2</code><code>%</code><code>3</code><code>%</code><code>...</code><code>100</code><code>%</code>
<code> </code><code>加了\r之后:</code>
<code> </code><code>r </code><code>=</code> <code>'\r%d%%'</code> <code>%</code><code>(num) </code><code>#num是一个可遍历的变量</code>
<code> </code><code>输出:</code><code>2</code><code>%</code><code>会把</code><code>1</code><code>%</code><code>覆盖,</code><code>3</code><code>%</code><code>会把</code><code>2</code><code>%</code><code>覆盖,最后是</code><code>100</code><code>%</code>
<code> </code>
<code>#进度条案例</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>time</code>
<code>def</code> <code>jindutiao(num,total):</code>
<code> </code><code>r </code><code>=</code> <code>num </code><code>/</code> <code>total</code>
<code> </code><code>r1 </code><code>=</code> <code>int</code><code>(r</code><code>*</code><code>100</code><code>)</code>
<code> </code><code>#result = '%d%%' %(r1) #没有格式化输出</code>
<code> </code><code>result </code><code>=</code> <code>'\r%s>%d%%'</code> <code>%</code><code>(</code><code>"="</code><code>*</code><code>num,r1) </code><code>#有格式化输出</code>
<code> </code><code>sys.stdout.write(result)</code>
<code> </code><code>sys.stdout.flush()</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>1</code><code>,</code><code>101</code><code>):</code>
<code> </code><code>time.sleep(</code><code>0.1</code><code>) </code><code>#延迟0.1s</code>
<code> </code><code>jindutiao(i,</code><code>100</code><code>)</code>
五、python模块os
<code>#OS(跟系统相关的东西都在里边)</code>
<code>os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径</code>
<code>os.chdir(</code><code>"dirname"</code><code>) 改变当前脚本工作目录;相当于shell下cd</code>
<code>os.curdir 返回当前目录: (</code><code>'.'</code><code>)</code>
<code>os.pardir 获取当前目录的父目录字符串名:(</code><code>'..'</code><code>)</code>
<code>os.makedirs(</code><code>'dir1/dir2'</code><code>) 可生成多层递归目录</code>
<code>os.removedirs(</code><code>'dirname1'</code><code>) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推</code>
<code>os.mkdir(</code><code>'dirname'</code><code>) 生成单级目录;相当于shell中mkdir dirname</code>
<code>os.rmdir(</code><code>'dirname'</code><code>) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname</code>
<code>os.listdir(</code><code>'dirname'</code><code>) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印</code>
<code>os.remove() 删除一个文件</code>
<code>os.rename(</code><code>"oldname"</code><code>,</code><code>"new"</code><code>) 重命名文件</code><code>/</code><code>目录</code>
<code>os.stat(</code><code>'path/filename'</code><code>) 获取文件</code><code>/</code><code>目录信息</code>
<code>os.sep 操作系统特定的路径分隔符,win下为</code><code>"\\",Linux下为"</code><code>/</code><code>"</code>
<code>os.linesep 当前平台使用的行终止符,win下为</code><code>"\t\n"</code><code>,Linux下为</code><code>"\n"</code>
<code>os.pathsep 用于分割文件路径的字符串</code>
<code>os.name 字符串指示当前使用平台。win</code><code>-</code><code>></code><code>'nt'</code><code>; Linux</code><code>-</code><code>></code><code>'posix'</code>
<code>os.system(</code><code>"bash command"</code><code>) 运行shell命令,直接显示</code>
<code>os.environ 获取系统环境变量</code>
<code>os.path.abspath(path) 返回path规范化的绝对路径</code>
<code>os.path.split(path) 将path分割成目录和文件名二元组返回</code>
<code>os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素</code>
<code>os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素</code>
<code>os.path.exists(path) 如果path存在,返回</code><code>True</code><code>;如果path不存在,返回</code><code>False</code>
<code>os.path.isabs(path) 如果path是绝对路径,返回</code><code>True</code>
<code>os.path.isfile(path) 如果path是一个存在的文件,返回</code><code>True</code><code>。否则返回</code><code>False</code>
<code>os.path.isdir(path) 如果path是一个存在的目录,则返回</code><code>True</code><code>。否则返回</code><code>False</code>
<code>os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略</code>
<code>os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间</code>
<code>os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间</code>
六、python加密模块hashlib
<code>#md5是不可逆的,通过密文比较方法确认</code>
<code>#例如:</code>
<code>import</code> <code>hashlib </code><code>#导入加密模块</code>
<code>obj </code><code>=</code> <code>hashlib.md5() </code><code>#定义MD5加密</code>
<code>#obj.update('123') #python2.7的写法</code>
<code>obj.update(bytes(</code><code>'123'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>)) </code><code>#python3.0的写法,必须用bytes</code>
<code>result </code><code>=</code> <code>obj.hexdigest() </code><code>#obj.hexdigest就是获取加密后的字符串</code>
<code>print</code><code>(result) </code><code>#打印加密后的字符串</code>
<code>#为了防止MD5 对称破解,可以用一下方法来解决:</code>
<code>import</code> <code>hashlib </code><code>#导入加密模块</code>
<code>obj </code><code>=</code> <code>hashlib.md5(bytes(</code><code>'djfjdsofhosdfjo13432534eee'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>)) </code>
<code> </code><code>#定义MD5加密,首先加密这里的字符串</code>
<code>#obj.update('123') #python2.7的写法加密</code>
<code>obj.update(bytes(</code><code>'123'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>)) </code><code>#python3.0的写法加密,必须用bytes</code>
<code> </code><code>#这里加密是在上边定义的时候加密基础之上再加密。</code>
<code>result </code><code>=</code> <code>obj.hexdigest() </code><code>#obj.hexdigest就是获取加密后的字符串</code>
<code>print</code><code>(result) </code><code>#打印加密后的字符串</code>
七、python正则表达式
<code>#正则表达式用的python的re模块</code>
<code>#它是一个小型编程语言,主要做字符串的一个匹配</code>
<code>#导入 import re</code>
<code>1.re</code><code>.findall(x,y)</code>
<code> </code><code>#去字符串y里边,把所有匹配规则x的的结果,通过一个列表形式返回来。</code>
<code> </code><code>import</code> <code>re</code>
<code> </code><code>a</code><code>=</code> <code>re.findall(</code><code>'yang'</code><code>,</code><code>'dkfjdyangdif'</code><code>)</code>
<code> </code><code>print</code><code>(a)</code>
<code>2.</code><code>字符分为:</code><code>1</code><code>、普通字符</code>
<code> </code><code>2</code><code>、元字符: . ^ $ * + ? {} [] | () \ (11个)</code>
<code> </code><code>1 . 代表除换行符以外的任何一个字符</code>
<code> </code><code>2 ^ 匹配字符串开始位置</code>
<code> </code><code>3 $ 匹配字符串终止位置 </code>
<code> </code><code>4 * 匹配0-多次</code>
<code> </code><code>5 + 匹配1-多次</code>
<code> </code><code>6 ? 匹配0-1次</code>
<code> </code><code>7 {} 匹配固定几次,或者一个范围</code>
<code> </code><code>{1-5}从1-5次</code>
<code> </code><code>{,5}从0-5次</code>
<code> </code><code>{1,}从1-多次</code>
<code> </code><code>8</code> <code>[] 匹配或的概念</code>
<code> </code><code>1.匹配b或者c都会匹配到输出(只能匹配一个字符)</code>
<code> </code><code>p1 </code><code>=</code> <code>re.findall(</code><code>'a[bc]d'</code><code>,</code><code>'abd'</code><code>)</code>
<code> </code><code>print</code><code>(p1)</code>
<code> </code><code>2.</code><code>匹配范围(匹配a</code><code>-</code><code>z的范围,但这里只能匹配一个字符)</code>
<code> </code><code>p1 </code><code>=</code> <code>re.findall(</code><code>'a[a-z]d'</code><code>,</code><code>'add'</code><code>)</code>
<code> </code><code>3.</code><code>匹配字符集(匹配</code><code>+</code><code>号之前的a</code><code>-</code><code>z的n个字符都会被匹配)</code>
<code> </code><code>p1 </code><code>=</code> <code>re.findall(</code><code>'a[a-z]+d'</code><code>,</code><code>'addfddd'</code><code>)</code>
<code> </code><code>4.</code><code>中括号里边具有特殊意义的字符:</code>
<code> </code><code>1</code> <code>-</code> <code>中横线代表范围:a</code><code>-</code><code>z </code><code>0</code><code>-</code><code>9</code>
<code> </code><code>2</code> <code>^ 代表非,否的意思</code>
<code> </code><code>3</code> <code>\d 代表数字</code>
<code> </code><code>9</code> <code>\ 功能: </code><code>1</code><code>、\后加元字符,取消元字符的功能</code>
<code> </code><code>2</code><code>、\后加某些字符有一些特殊的意义</code>
<code> </code><code>例:匹配单词字符</code>
<code> </code><code>import</code> <code>re</code>
<code> </code><code>#匹配首字母I,而不是字符串里边的I</code>
<code> </code><code>p1 </code><code>=</code> <code>re.findall(r</code><code>'I\b'</code><code>,</code><code>'I am abcIdd'</code><code>)</code>
<code> </code><code>#r :代表原生字符串,r后边都是普通字符串</code>
<code> </code><code>#\b :匹配单词的开始或结束</code>
<code> </code><code>10</code> <code>\w 匹配字母或数字或下划线或汉字</code>
<code> </code><code>11</code> <code>\s 匹配任意的空白符</code>
<code> </code><code>12</code> <code>\d 匹配数字</code>
<code> </code><code>13.</code> <code>\b 匹配单词的开始或结束</code>
<code>3.</code><code>函数方法:</code>
<code> </code><code>1.match</code> <code>匹配起始位置;match().group() group是match一个方法,取匹配值</code>
<code> </code><code>2.search</code> <code>匹配到第一个就结束</code>
<code> </code><code>3.findall</code> <code>返回一个列表</code>
<code> </code><code>finditer 返回一个对象,可以遍历、取值</code>
<code> </code><code>4.sub</code> <code>匹配,替换</code>
<code> </code><code>subn 不但匹配、替换,还会把替换的次数打印出来</code>
<code> </code><code>5.split</code> <code>分割</code>
<code> </code><code>6.re</code><code>.</code><code>compile</code><code>(strPattern[,flag])</code>
<code> </code><code>这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象</code>
<code> </code><code>。第二个参数flag是匹配模式,取值可以使用按位或运算符‘|’表示同时生效,如:</code>
<code> </code><code>re.I | re.M</code>
<code> </code><code>可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译</code>
<code> </code><code>成正则表达式对象,这样可以提高一定的效率,下面是一个正则表达式对象的一个例子</code>
<code> </code><code>import</code> <code>re</code>
<code> </code><code>text </code><code>=</code> <code>"aaa is a handsome boy,he is cool,clever,and so on..."</code>
<code> </code><code>regex </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'\w*oo\w*'</code><code>)</code>
<code> </code><code>print</code><code>(regex.findall(text))</code>
<code>4.</code><code>正则表达式分组</code>
<code> </code><code>(去已经匹配到的数据中,再匹配数据)</code>
<code> </code><code>r.group() 用</code><code>"字符串"</code><code>来匹配</code>
<code> </code><code>r.groups() 用()来匹配</code>
<code> </code><code>r.groupdict() 用?P<name> 来匹配,定义name为key,取的值为value</code>
<code> </code><code>例:</code>
<code> </code><code># import re</code>
<code> </code><code># text = "has hal dfdsjlfjdsl"</code>
<code> </code><code># r = re.match("h(?P<name>\w+)",text) #只匹配首</code>
<code> </code><code># print(r.group())</code>
<code> </code><code># print(r.groups())</code>
<code> </code><code># print(r.groupdict())</code>
<code> </code><code>输出:</code>
<code> </code><code>has</code>
<code> </code><code>(</code><code>'as'</code><code>,)</code>
<code> </code><code>{</code><code>'name'</code><code>: </code><code>'as'</code><code>}</code>
<code> </code><code># text = "has hal dfdsjlfjdsl hao" #匹配多个</code>
<code> </code><code># r = re.findall("h\w+",text)</code>
<code> </code><code># print(r)</code>
<code> </code><code>[</code><code>'has'</code><code>, </code><code>'hal'</code><code>, </code><code>'hao'</code><code>]</code>
<code> </code><code># text = "has hal dfdsjlfjdsl hao"</code>
<code> </code><code># r = re.findall("h(\w+)",text)</code>
<code> </code><code>[</code><code>'as'</code><code>, </code><code>'al'</code><code>, </code><code>'ao'</code><code>]</code>
<code> </code><code># text = "hasbs hisbs dfdsjlfjdsl hdsas"</code>
<code> </code><code># r1 = re.findall("h(\w+)s(b)s",text)</code>
<code> </code><code># print(r,r1)</code>
<code> </code><code>[</code><code>'asbs'</code><code>, </code><code>'isbs'</code><code>, </code><code>'dsas'</code><code>] [(</code><code>'a'</code><code>, </code><code>'b'</code><code>), (</code><code>'i'</code><code>, </code><code>'b'</code><code>)]</code>
<code> </code><code>text </code><code>=</code> <code>"asbs hisbs dfdsjlfjdsl hdsas"</code>
<code> </code><code>r1 </code><code>=</code> <code>re.split(</code><code>"s(b)s"</code><code>,text,</code><code>1</code><code>)</code>
<code> </code><code>print</code><code>(r1)</code>
<code> </code><code>#输出:</code>
<code> </code><code>[</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>' hisbs dfdsjlfjdsl hdsas'</code><code>]</code>
本文转自506554897 51CTO博客,原文链接:http://blog.51cto.com/506554897/1829307,如需转载请自行联系原作者