链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文件操作

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 

####文件操作:open###
f = open('file','r+',encoding='utf-8')   #以utf-8格式打开文件
#打开模式:
#r:只读
#w:只写,写之前清空文件
#x:python3新加,如果文件存在,就报错,如果文件不存在,就创建文件并向文件只写
#a:追加
#rb、wb、ab:以二进制方式操作文件,这时就不需要使用encoding参数了
#r+:可读可写,文件指针默认在尾部
#w+:可读可写
#a+:可读可写

data = f.read()   #读取文件内容,无参数时读取文件所有内容,有参数时,根据打开方式进行区分:r,读取相应字符长度,rb,读取相应字节长度
print(data)

f.readline()    #仅读取一行


#打开文件后,文件指针位置默认在开头,要想偏移指针,就要用到seek
f.seek(6)   #文件指针位置偏移(单位是字节)
print(f.tell())  #获取当前指针的位置(单位是字节)

f.truncate()   #截断,将文件指针后面的内容全部清空

#使用seek后要继续进行写操作,则写入位置就是从seek偏移后的位置开始,一直往后覆盖
f.write('hello')

f.flush()   #文件没有关闭的情况下,强制刷新数据到文件中

f.close()   #关闭文件

########################################

with open('file','r+') as f:
    pass


#with还支持同时打开两个文件(python2.7以后才支持)
with open('file','r+') as f1,open('file2','r+') as f2:
    pass

 

其他

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 

print(abs(-1))   #取绝对值

#参数所有元素都为真,才为真
print(all([1,2,3,4]))    #all参数为一个可迭代对象,作用是判断这个可迭代对象的所有元素是否都为真,若是,则返回True
#参数所有元素都为假,才为假
print(any([0,1,2,3]))    #any参数为一个可迭代对象,作用是判断这个可迭代对象的所有元素是否有真值,若有,则返回True

print(bin(3))   #将十进制转换为二进制
print(oct(9))   #将十进制转换为八进制
print(hex(17))  #将十进制转换为十六进制

print(bool(2))   #判断参数bool类型


#编码:
#utf-8:一个汉字占3个字节
#gbk:一个汉字占2个字节
s = '张三'
#bytes方法:将字符串转换成指定编码的字节类型(utf-8就是每个汉字3个字节,gbk就是每个汉字2个字节)
print(bytes(source=s,encoding='utf-8'))
print(bytes(source=s,encoding='gbk'))

b = bytes(source=s,encoding='utf-8')   #utf-8形式的字节类型
print(str(b,encoding='utf-8'))   #将字节转换为字符串(以utf-8形式)
内置函数1
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 

def f1():
    return True

f2 = 123

#callable,判断是否能被执行(调用),能则返回True
print(callable(f1))   #f1是函数,可以被调用,返回True
print(callable(f2))   #f2是变量,不能被调用,返回False


################################################################

print(chr(65))   #将十进制数转化为对应的编码的字符
print(ord('A'))  #将字符转化为十进制编码
################################################################
s = 'print(123)'

r = compile(s,'<string>','exec')   #将字符串s编译成可执行的python代码
print(r)

exec(r)   #执行上面编译的代码,无返回值
'''

#eval,将字符串转换成表达式,有返回值
s1 = "8*8"
re1 = eval(s1)
print(re1)

s2 = "{'name':'alex'}"
re2 = eval(s2)
print(type(re2),re2)


################################################################

re = divmod(97,10)  #97/7,获得其商和余数
print(re,re[0],re[1])   #re[0]为商,re[1]为余数
#上面也可以这样写
n1,n2 = divmod(97,10)   #n1为商,n2为余数
print(n1,n2)
'''


#isinstance(),用来判断对象是否是某个类的实例
s = 'alex'
re = isinstance(s,str)   #判断s是否是str的实例
print(re)
内置函数2
#!/usr/bin/env python
# -*- coding: utf-8 -*-


li = [11,22,33,44,55]

def f(a):
    if a > 22:
        return True

ret = filter(f,li)   #filter,将列表的每个元素分别传入f,如果f的返回值为True,则将该元素放入ret中,返回值为False则丢弃
print(list(ret))


f1 = lambda a:a > 30
print(f1(20))   #lambda表达式返回True和False


li = [11,22,33,44,55]
re = filter(lambda a:a > 33,li)    #过滤出li中大于33的元素
print(list(re))


li = [11,22,33,44,55]

ret = map(lambda a:a+100,li)   #map,列表中每个元素分别执行lambda函数,生成一个新的结果赋给ret
print(list(ret))


name = 'alex'
def f():
    a = 123
    print(globals())   #globals,用来存放所有的全局变量(包括自定义的和系统提供的)
    print(locals())   #locals,用来存放所有的局部变量

f()   #打印结果显示全局变量中有name,局部变量有a

print(id(name))    #查看内存地址

s = '张三'
print(len(s))  #python3中按字符进行计算,python2中按字节进行计算


print(pow(2,3))   #求指数:2的3次方

##########################################################################

#列表的reverse方法和全局reversed方法效果是一致的,列表的reverse方法内部就是调用全局revesed方法
li = [1,2,3]
li.reverse()
print(li)
print(list(reversed(li)))

##########################################################################

print(round(1.4))  #四舍五入




##########################################################################
l1 = ['alex',1,2,3]
l2 = ['is',4,5,6]
l3 = ['sb',7,8,9]

#zip,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。
# 若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同
print(list(zip(l1,l2,l3)))
内置函数3
#!/usr/bin/env python
# -*- coding: utf-8 -*-


def outer(func):
    def inner():
        print('before')
        ret = func()
        print('after')
        return ret
    return inner


# 装饰器:@+函数名
# 功能:1、自动执行outer函数并将其下面的函数名f当做参数传递;2、将outer函数的返回值重新赋值给f

@outer
def f():
    print('f1')
    return 'haha'


s = f()
print(s)


################################################################################
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
函数中带参数的装饰器
'''


def outer(func):
    def inner(*args,**kwargs):
        print('before')
        ret = func(*args,**kwargs)
        print('after')
        return ret
    return inner

@outer
def f(arg):
    print(arg)
    return 'f'

print(f('hello'))

@outer
def f1(arg1,arg2):
    print(arg1,arg2)
    return 'f1'

print(f1('hello','tom'))
装饰器
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
一个函数可以被多个装饰器装饰,执行过程是从上向下---------本质是装饰器的嵌套
'''

USER_INFO = {}

#判断用户是否登录
def check_login(func):
    def inner(*args,**kwargs):
        if USER_INFO.get('is_login') == True:
            ret = func(*args,**kwargs)
            return ret
        else:
            print('请先登录!')
    return inner

#判断用户是否是管理员
def check_admin(func):
    def inner(*args,**kwargs):
        if USER_INFO.get('user_type') == 2:
            ret = func(*args,**kwargs)
            return ret
        else:
            print('无权限查看!')
    return inner


#先判断用户是否登录,再判断用户是否是管理员
@check_login
@check_admin
def index():
    '''
    管理员功能
    :return:
    '''
    print('管理员页面')

def login():
    user = input('user:')
    if user == 'alex':
        USER_INFO['is_login'] = True
        USER_INFO['user_type'] = 1
    elif user == 'admin':
        USER_INFO['is_login'] = True
        USER_INFO['user_type'] = 2

@check_login
def home():
    '''
    普通用户功能
    :return:
    '''
    print('普通用户页面')

def main():
    while True:
        print('1、登录  2、查看用户信息  3、管理员管理')
        select = input('请选择:')
        if select == '1':
            login()
        elif select == '2':
            home()
        elif select == '3':
            index()

if __name__ == '__main__':
    main()
双层装饰器
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
两种字符串格式化方式
'''

'''
#%.2f:保留两位小数
s = 'hello %(name)s,my age is %(age)d.my money has only %(money).2f' % {'name':'alex','age':20,'money':1000.2456}
print(s)

#没有占位符时,一个%就是一个字符
s1 = 'hello %'
print(s1)
#字符串中有占位符时,要想在字符串中显示‘%’,就要这样写:%%(注意:这时只写一个%会报错)
s2 = 'hello %s %%' % ('alex')
#s2 = 'hello %s %' % ('alex')    #报错
print(s2)
'''

msg = 'hello {name},your {car} is so good!'.format(name='maco',car='bike')   # 格式化字符串
# msg = 'hello {name},your {car} is so good!'.format(**{'name':'maco','car':'bike'})   #上面等价写法
print(msg)
# 结果:hello maco,your bike is so good!

msg1 = 'my name is {},my age is {}'.format('alex', 20)  # 按顺序依次传入
# msg1 = 'my name is {},my age is {}'.format(*['alex',20]) # 上面等价写法
print(msg1)

msg2 = '{0} is a good man,he is {1}.{0} is so cool!'.format('Maco','26')  # 按照下标传入(从0开始)
print(msg2)
# 结果:Maco is a good man,he is 26

msg3 = 'the percent is {:.2%}'.format(0.8)   # {:%}将传入的参数转化为百分比显示,并且取两位小数位
print(msg3)

msg4 = 'the title:{:*^20s}'.format('book')  #传入参数占20个字符的长度,参数居中,其他空位用*填充,匹配字符类型(s)
print(msg4)

msg5 = 'the num is {:#b}'.format(10)  #以二进制显示。(#o:八进制、#x:十六进制)---#表示进制转换后前面添加的0b、0o、0x
print(msg5)

msg6 = 'my name is {:s},my age is{:d}.I have ${:f}'.format('alex',18,1000.23)  #按顺序依次传入,但是指定了传入参数的数据类型
print(msg6)
字符串格式化
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
'''
生成器:使用函数创造
普通函数的返回值用return,生成器的返回值用yield

生成器每次执行到yield的位置后就停止执行并返回数据,待下次执行生成器时,又从上次停止的地方继续向下执行
'''

def func():
    print(111)
    yield 1
    print(222)
    yield 2
    print(333)
    yield 3

ret = func()
'''
r1 = ret.__next__()
print(r1)
r2 = ret.__next__()
print(r2)
r3 = ret.__next__()
print(r3)
'''
for i in ret:
    print(i)
生成器
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
递归:函数自己调用自己
'''

#累加
def func(n):
    if n == 1:
        return 1
    sum = n + func(n-1)
    return sum

s = func(3)
print(s)

#累乘
def func1(n):
    if n == 1:
        return 1
    s = n * func1(n-1)
    return s

s1 = func1(7)
print(s1)
递归

 

posted on 2016-11-04 13:43  链条君  阅读(217)  评论(0编辑  收藏  举报