Python基础第五天
双层装饰器
字符串格式化
Python字符串格式有2种方式:百分号方式、format方式;建议使用format方式
1.百分号方式
格式:%[(name)][flags][width].[precision]typecode
1)顺序传参数
2)指定名称传入参数
3)保留小数点后几位
4)如果出现占位符,则写%%,打印时%
- (name)可选,用来选择指定的key或者变量
>>> s = "my name is %(name)s" % {"name":'xiaoming'}
>>> print(s)
my name is xiaoming
- flags 可选,可使用值如下(依赖width宽度):
+ 右对齐;正数前加正好,负数前加负号
>>> s = "my name is %+10d " % (8) # 10代表右对齐10个空格
>>> print(s)
my name is +8 # 正数前面加+号
>>> s = "my name is %10d " % (-8)
>>> print(s)
my name is -8 # 负数前面加-号
- 左对齐;正数前无符号,负数前加负号;
>>> s = "my name is %-5d number " % (8) # 5代表5个空格
>>> print(s)
my name is 8 number # 正数前面不加符号
>>> s = "my name is %-5d number " % (-8)
>>> print(s)
my name is -8 number # 负数前面加-号
空格 右对齐;正数前加空格,负数前加负号;
>>> s = "my name is % 3d number " % (8)
>>> print(s)
my name is 8 number # 正数前面不加符号
>>> s = "my name is % 3d number " % (-8)
>>> print(s)
my name is -8 number # 负数前面加-号
0 右对齐;正数前无符号,负数前加负号;用0填充空白处;
>>> s = "my name is %010d number " % (8)
>>> print(s)
my name is 0000000008 number
>>> s = "my name is %010d number " % (-8)
>>> print(s)
my name is -000000008 number
- .precision 可选,小数点后保留的位数;
>>> s = "my name is %.2f number " % (8.19932109765)
>>> print(s)
my name is 8.20 number # .2 代表取浮点数后面2位数,并且是四舍五入
- width 可选,占有宽度
- typecode 必选,可选参数如下:
>>> s = "my name is %s number " % ('abc')
>>> print(s)
my name is abc number
c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
o,将整数转换成 八 进制表示,并将其格式化到指定位置
x,将整数转换成十六进制表示,并将其格式化到指定位置
>>> s = "my name is %c %o %x number " % (65,15,15)
>>> print(s)
my name is A 17 f number # %o 转换unicode %c转换十进制 %x转换十六进制
>>> s = "my name is %d number " % (123456789)
>>> print(s)
my name is 123456789 number
E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
>>> s = "my name is %e number " % (100)
>>> print(s)
my name is 1.000000e+02 number
>>> s = "my name is %e number " % (100)
>>> print(s)
my name is 1.000000e+02 number # %e %E 算次方
>>> s = "my name is %f number " % (1.123456789)
>>> print(s)
my name is 1.123457 number
g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
%,当字符串中存在格式化标志时,需要用 %%表示一个百分号
>>> s = "my name is %s %% number " % ('abc')
>>> print(s)
my name is abc % number # %% 第一%相当于一个转义符
2.百分号方式
格式:[[fill]align][sign][#][0][width][,][.precision][type]
- fill 可选,空白处填充的字符
- align 可选,对齐方式(需配合width使用)
=,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
^,内容居中
>>> s = "my name is {:@<20}".format('xiaoming') # : 是格式,后面@是空白处填充物,<是左对齐,20是宽度
>>> print(s)
my name is xiaoming@@@@@@@@@@@@
>>> s = "my name is {:@>20}".format('xiaoming') # : 是格式,后面@是空白处填充物,>是右对齐,20是宽度
>>> print(s)
my name is @@@@@@@@@@@@xiaoming
>>> s = "my name is {:@^20}".format('xiaoming') # : 是格式,后面@是空白处填充物,^是居中对齐,20是宽度
>>> print(s)
my name is @@@@@@xiaoming@@@@@@
- sign 可选,有无符号数字
>>> s = "my name is {:+} {:-} {: }".format(1,2,3)
>>> print(s)
my name is +1 2 3
>>> s = "my name is {:+} {:-} {: }".format(-1,-2,-3)
>>> print(s)
my name is -1 -2 -3
- # 可选,对于二进制、八进制、十进制,如果加上#,会显示0b/0o/0x,否则不显示
- ,可选,为数字添加分隔符,例如:1,000,000
>>> s = "my name is {:,}".format(1000)
>>> print(s)
my name is 1,000
- width 可选,格式化位所占宽度
- .precision 可选,小数位保留精度
>>> s = "my name is {:.2f}".format(1000.123)
>>> print(s)
my name is 1000.12
- type 可选,格式化类型
传入“字符串类型”的参数
s,格式化字符串类型数据
空白,未指定类型,默认是None,同s
传入“整数类型”的参数
b,将10进制整数自动转换成2进制表示然后格式化 c,将10进制整数自动转换为其对应的unicode字符 d,10进制整数 o,将10进制整数自动转换为8进制表示然后格式化 x,将10进制整数自动转换为16进制表示然后格式化(小写x) X,将10进制整数自动转换为16进制表示然后格式化(大写X)>>> s = "my name is {:b} {:c} {:d} {:o} {:x} {:X}".format(20,20,20,20,20,20)
>>> print(s)
my name is 10100 20 24 14 14
传入“浮点型或小数类型”的参数
e,转换为科学计数法(小写e)表示然后格式化 E,转换为科学计数法(大写e)表示然后格式化 f,转换为浮点型(默认小数点后保留6位)表示,然后格式化 F,转换为浮点型(默认小数点后保留6位)表示,然后格式化; g,自动在e和f中切换 G,自动在E和F中切换 %,显示百分比(默认显示小数点后6位)>>> s = "my name is {:%}".format(1.33333334444)
>>> print(s)
my name is 133.333334%
必须掌握的常用格式化:
# 通过位置传参数 >>> s = "my name is {}, age {}, alias {}".format("xiaoming",18,"xm") # 字符串方式 字符串使用双引号
>>> print(s)
my name is xiaoming, age 18, alias xm >>> s = "my name is {}, age {}, alias {}".format(*["xiaoming",18,"xm"]) # *[] , *args万能参数 []列表 列表中字符串使用双引号
>>> print(s)
my name is xiaoming, age 18, alias xm >>> s = "my name is {0}, age{1}, alias{0}".format(*["xiaoming",18,"xm"]) # *[] , *args万能参数 []列表 列表中字符串使用双引号
>>> print(s)
my name is xiaoming, age18, aliasxiaoming >>> s = "my name is {2}, age {1}, alias {2}".format(*["xiaoming",18,"xm"]) # *[] , *args万能参数 []列表 列表中字符串使用双引号
>>> print(s)
my name is xm, age 18, alias xm # 通过变量传参 >>> s = "my name is {name}, age{age}, alias{alias}".format(name='xiaoming',age=1
8,alias='xm')
>>> print(s)
my name is xiaoming, age18, aliasxm >>> s = "my name is {name}, age {age}, alias {alias}".format(**{"name":"xiaoming # **[] , *kwargs万能参数 {}字典 字典中字符串使用双引号
","age":18,"alias":"xm"})
>>> print(s)
my name is xiaoming, age 18, alias xm # 通过下标传参 >>> s = "my name is {0[0]}, age {0[1]}, alias {0[2]}".format(["lisi",18,"lis"],[
"zhangsan",19,"zs"])
>>> print(s)
my name is lisi, age 18, alias lis >>> s = "my name is {1[0]}, age {1[1]}, alias {1[2]}".format(["lisi",18,"lis"],[
"zhangsan",19,"zs"])
>>> print(s)
my name is zhangsan, age 19, alias zs # 通过字符串类型传参 >>> s = "my name is {:s}, age {:d}, number {:f}".format(*["xiaoming",18,1.111223
33])
>>> print(s)
my name is xiaoming, age 18, number 1.111223 >>> s = "my name is {:s}, age {:d}, number {:f}".format("xiaoming",18,1.11122333
)
>>> print(s)
my name is xiaoming, age 18, number 1.111223 >>> s = "my name is {name:s}, age {age:d}, number {number:f}".format(**{"name":"
xiaoming","age":18,"number":1.22233444})
>>> print(s)
my name is xiaoming, age 18, number 1.222334 >>> s = "my name is {name:s}, age {age:d}, number {number:f}".format(name="xiaom
ing",age=18,number=1.22233444)
>>> print(s)
my name is xiaoming, age 18, number 1.222334
生成器
使用函数创造,函数中出现yield就是生成器,通过for循环执行
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器
生成器基本语法
>>> def func():
... yield 1
... yield 2
... yield 3
上面func()函数中出现了yield就是一个生成器,当执行函数func()时会得到一个迭代器
>>> ret = func()
>>> ret.__next__()
1
>>> ret.__next__()
2
>>> ret.__next__()
3
>>> ret.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
利用生成器自定义range
>>> def range(arg):
... start = 0
... while True:
... if start > arg:
... return
... yield start
... start += 1
...
>>> ret = range(3)
>>> for i in ret:
... print(i)
...
0
1
2
3
迭代器
迭代器不会将内容全部放入内存,而是一行一行迭代,上面生成器例子中使用迭代器的表现
# 使用__next__方法一行一行迭代,需要写多个__next__
r = ret.__next__()
print(r) # 使用for循环方式迭代,直到越界报错(StopIteration)
for i in ret:
print(i)
递归
- 官方解释
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
- 递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(比如Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)
- 递归的缺点
递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等
- 举个列子
>>> def d():
... return '123'
...
>>> def c():
... r = d()
... return r
...
>>> def b():
... r = c()
... return r
...
>>> def a():
... r = b()
... print(r)
...
>>> a()
123
>>> def func(n):
... n += 1
... if n >= 4:
... return 'end'
... else:
... print(n,"start")
... return func(n)
...
>>> r = func(1)
2 start
3 start
>>> print(r)
end # 执行过程
1.调用函数传参数1
2.执行n+=1,此时n变成2
3.if判断n<4
4.执行else 打印n和start
5.if判断结束
6.执行函数return返回值,此时又调用了func(n)函数,并传参n=2
7.知道if判断n>=4
8.返回end结束
模块
Python模块分为内置模块、自定义模块、第三方模块
- 使用模块为了将代码分类,方便相互调用
- 自定义模块存放路径很重要,一定要能调用到
- 自定义模块的名称也很重要,不要和内置模块或者第三方模块相同,默认会先在当前脚本目录查找模块,如果找到不会继续查找
查看系统模块存放位置
import sys
ret = sys.path
for i in ret:
print(i)
# Python查找模块的优先级,找到不往下面找
C:\Users\Administrator\PycharmProjects\s13\day5
C:\Users\Administrator\PycharmProjects\s13
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python35.zip
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python35
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages # 一般自定义模块放到这个目录
模块的导入方法的2中方法
# 方法一import导入
import sys
sys.path import lib.s4
lib.s4login() #方法二form导入
form s4 import login
login() form s4 import logout
logout() form s4 import *
login()
logout() # 不建议使用form方式,使用import方式,使用什么导入什么例如s4.login s4.logout
Python基础第五天的更多相关文章
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- Python基础知识(五)------字典
Python基础知识(四)------字典 字典 一丶什么是字典 dict关键字 , 以 {} 表示, 以key:value形式保存数据 ,每个逗号分隔 键: 必须是可哈希,(不可变的数据类型 ...
- python基础(五)
一.os模块 import os# os.rename(old,new)#重命名# os.remove(f)#删除文件 # os.mkdir('china/beijing') #创建文件夹# os.m ...
- python基础(五)函数
一.函数概念 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal ...
- python基础-第五篇-5.4正则表达式
正则基础知识 正则表达式是通过调用re模块实现的 在python里,正则表达式处理对象为字符串,所以正则里方法和字符串的方法有很多相似的地方:re.findall和find,re.split和spli ...
- 【Python基础学习五】列表,元祖,字典
1.列表(list) 列表是Python的一种内置数据类型,list是一种有序的集合,可以随时添加和删除其中的元素,就像动态数组一样.获取list中的元素用角标获取,角标可以使用正角标,也可以使用负角 ...
- python基础知识五
数据结构基本上就是---它们可以处理一些数据的结构.或者说,它们是用来存储一组相关数据的. python中有三种内建的数据结构---列表.元祖和字典. 我们将会学习如何使用它们,以及它们如何使编程变得 ...
- Python基础(五)-函数
函数: 1.定义与使用: def 函数名(参数): "函数_文档字符串" 函数体 ... return [表达式] ## def:表示函数的关键字 函数名:函数名称,根据函数名调用 ...
- Python基础篇(五)
bool用于判断布尔值的结果是True还是False >>> bool("a") True >>> bool(3) True >>& ...
随机推荐
- resumable.js —— 基于 HTML 5 File API 的文件上传组件 支持续传后台c#实现
在git上提供了java.nodejs.c#后台服务方式:在这里我要用c#作为后台服务:地址请见:https://github.com/23/resumable.js 我现在visual studio ...
- composer在ubuntu下安装
通过curl下载composer安装包 curl -sS https://getcomposer.org/installer | php 将安装包移动到全局安装文件夹下 mv composer.pha ...
- RFID电子标签加工的倒装工艺
倒装对于半导体封装领域的人员而言,是再熟悉不过的了.一般我们看到的集成电路多数以塑封为主,半导体芯片和外界进行信息沟通的通道,靠的就是集成电路的管脚.如果把集成电路外面的封装去掉,会发现每个集成电路内 ...
- cocos2d-x Loading界面实现资源加载
有时候场景中的资源加载过多的话就会引起游戏进入的时候很卡,因为那是边加载边显示.在tests例子里面有一个很好的例子叫做TextureCacheTest,里面讲解了如何写loading. #inclu ...
- cache buffers chains latch
cache buffers chains latch 从 Oracle 8i Database 开始, 散列锁存器<-------(1:m)------>hash bucket<-- ...
- bzoj1149
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1149 水题..... 直接BFS. #include<cstdio> #inclu ...
- openstack组件手动部署整合
preface:当你完全且正确的配置好整个OpenStack ENV 你将能看到的和体验到的!!! 我们先来看看简单效果吧,祝君能在这条路上走的更远,更好;
- 为什么Nginx的性能要比Apache高很多?
为什么Nginx的性能要比Apache高很多? 这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的sele ...
- 为什么新建的管理员账号权限没有Administrator大?
Administrator是超级管理员,UAC不用确认,跟关了一样. 新建隶属于administrator组的用户,可以关掉UAC. 控制面板>系统和安全>操作中心>更改用户帐户控制 ...
- java 读取mysql库表数据
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...