小数据、文件操作及函数

小数据

小数据池:为了节省内存空间。

is、 == 和id

== :数值的比较
is :内存地址的比较
id 查看内存地址

int -5~256
str 有特殊字符不存在小数据池。
单个字符*int(20) 以内 有小数据池。

View Code

 编码 

英文:

  str: 表现形式: s = 'alex'
  内部编码方式:unicode

  bytes:表现形式: s = b'alex'

  内部编码方式:非unicode(utf-8,gbk...)
中文:
  str: 表现形式: s = '中国'
  内部编码方式:unicode

  bytes:表现形式: s = b'\xe2\xe2\xe2\xe2\xe2\xe2\'
  内部编码方式:非unicode(utf-8,gbk...)

str---> bytes s.encode('gbk') s.encode('utf-8') 编码
bytes ---> str s.decode('gbk') s.decode('utf-8') 解码

1 s = 'fdsagsadfsad方式打开家乐福;按时fdsafdsa'
2 #ip地址 端口等等
3 s1 = input('你好')
4 s1
5 s = 'laonanhai'
6 s1 = b'laonanhai'
7 print(type(s))
8 print(type(s1))
View Code
 1 s = 'alex'  # str
 2 s1 = s.encode('utf-8')  # bytes
 3 # encode 编码 :str --- > bytes
 4 s = 'hello girl'
 5 s1 = s.encode('utf-8')
 6 print(s1)
 7 
 8 s = 'hello girl'
 9 s1 = s.encode('gbk')
10 print(s1)
11 s = '中国'
12 s1 = s.encode('utf-8')
13 print(s1)
14 
15 s = '中国'
16 s1 = s.encode('gbk')
17 print(s1)
View Code

赋值与copy

对于赋值运算,指向的是同一个内存地址。字典,列表,集合都一样。

l1 = [1,2,3]
l2 = l1
l2.append(111)
# print(l1,l2)
print(id(l1))
print(id(l2))
s = 1000
s1 = s
print(id(s))
print(id(s1))

copy 不是指向一个,在内存中开辟了一个内存空间对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

 l1 = [1,2,3]
 l2 = l1.copy()
 l1.append(111)
 print(id(l1),id(l2))
 l1 = [1,2,[1,2,3,[22,33,44]],4]
 l2 = l1.copy()
 l1[2].append(666)
 print(l1)
 print(l2)
 print(id(l1))
 print(id(l2))

对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变.

 1 import copy
 2 l1 = [1, 2, [1, 2, 3], 4]
 3 l2 = copy.deepcopy(l1)
 4 l1[2].append(666)
 5 print(l1,l2)
 6 l2 = copy.deepcopy(l1)
 7 l1[2].append(666)
 8 print(l1)
 9 print(id(l1[2]),id(l2[2]))
10 l1 = [1,2,3]
11 l2 = l1
12 l2.append(111)
13 print(l1,l2)
14 
15 l1 = [1,2,3,[22,33]]
16 l2 = copy.deepcopy(l1)
17 print(l2)
18 l2 = l1[:]
19 l1[3].append(666)
20 print(l2)  # [1, 2, 3, [22, 33, 666]]
21 
22 l1 = [1,2,3,]
23 l2 = l1[:]
24 l1.append(666)
25 print(l2)
View Code

 文件操作

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

1,打开文件,产生一个文件句柄。
2,对文件句柄进行
3,关闭文件。

f = open('D:\护士老师主妇空姐联系方式.txt',encoding='utf-8',mode='r')
content = f.read()
print(content)

f:变量,f_obj,file,f_handler,...文件句柄。open windows的系统功能,windows默认编码方式:gbk,linux默认编码方式utf-8。f.close()

流程:打开一个文件,产生一个文件句柄,对文件句柄进行操作,关闭文件。

1、全部读出来

f = open('D:\护士老师主妇空姐联系方式.txt',encoding='gb2312')
1:全部读出来f.read()
f = open('log',encoding='utf-8')
content = f.read()
print(content,type(content))
f.close()

2、一行一行的读

f = open('log',encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()

 3、将原文件的每一行作为一哥列表的元素。

f = open('log',encoding='utf-8')
print(f.readlines())
f.close()

 4、读取一部分read(n),在r模式下,read(n)按照字符去读取。,在rb模式下,read(n)按照字节去读取。

f = open('log',encoding='utf-8')
print(f.read(3))
f.close()
f = open('log',mode='rb')
content = f.read(4)
print(content)
f.close()

 5、循环读取

f = open('log',encoding='utf-8')
for i in f:
    print(i.strip())
f.close()

6、非文字类的文件时,用rb

f = open('D:\护士老师主妇空姐联系方式.txt',mode='rb')
content = f.read()
print(content)
f.close()

1、没有文件,创建一个文件写入内容

f = open('log1',encoding='utf-8',mode='w')
f.write('儿科王金发;剪短发了肯定撒就废了;就')
f.close()

2、有文件,将原文件内容清空,在写入内容。

f = open('log1',encoding='utf-8',mode='w')
f.write('666')
f.close()

3、wb

f = open('log',mode='wb')
f.write('老男孩教育'.encode('utf-8'))
f.close()

4、没有文件,创建一个文件追加内容

f = open('log2',encoding='utf-8',mode='a')
# f.write('666')
# f.close()

5、有文件,直接追加内容。

f = open('log2',encoding='utf-8',mode='a')
f.write('666')
f.close()

7、r+ 先读,后追加 一定要先读后写

f = open('log',encoding='utf-8',mode='r+')
content = f.read()
print(content)
f.write('aaa')
f.close()

8、错误的

f = open('log',encoding='utf-8',mode='r+')
f.write('BBB')
content = f.read()
print(content)
f.close()

9、w+ 先写后读

f = open('log',encoding='utf-8',mode='w+')
f.write('中国')
#print(f.tell())  # 按字节去读光标位置
f.seek(3)  # 按照字节调整光标位置
print(f.read())
f.close()

10、a+ 追加读

f = open('log',encoding='utf-8',mode='a+')
f.write('BBB')
content = f.read()
print(content)
f.close()

11、其他方法

f = open('log',encoding='utf-8')
print(f.read())
print(f.writable())
f.close()

  f = open('log',encoding='utf-8',mode='a')
  f.truncate(7) # 按字节对原文件截取
  f.close()

12、功能一:自动关闭文件句柄,功能二:一次性操作多个文件句柄。

with open('log',encoding='utf-8') as f:
    print(f.read())
with open('log1',encoding='utf-8') as f1:
    print(f1.read())

with open('log',encoding='utf-8') as f1,\
    open('log1',encoding='utf-8') as f2:
    print(f1.read())
    print(f2.read())

1,将原文件读取到内存。
2,在内存中进行修改,形成新的内容。
3,将新的字符串写入新文件。
4,将原文件删除。
5,将新文件重命名成原文件。

import os
with open('log',encoding='utf-8') as f1,\
    open('log.bak',encoding='utf-8',mode='w') as f2:
    content = f1.read()
    new_content = content.replace('alex','SB')
    f2.write(new_content)
os.remove('log')
os.rename('log.bak','log')

import os
with open('log',encoding='utf-8') as f1,\
    open('log.bak',encoding='utf-8',mode='w') as f2:
    for i in f1:
        new_i = i.replace('SB','alex')
        f2.write(new_i)
os.remove('log')
os.rename('log.bak','log')

函数的初识

重复代码多,可读性差,所以函数产生了:函数就是封装一个功能。
例如:def my_len(): ;def 关键字 定义一个函数;my_len 函数名书写规则与变量一样。; def 与函数名中间一个空格。;函数名():加上冒号函数体

def my_len():
     count = 0
     for j in l1:
         count += 1
     print(count)
my_len()

函数的返回值,写函数,不要再函数中写print()

while True:
    print(222)
    print(666)
print(len([1,23,4]))

1,在函数中,遇到return结束函数。
2,将值返回给函数的调用者。

无 return
return None
return 1个值 该值是什么,就直接返回给函数的调用者,函数名()
return 多个值 将多个值放到一个元组里,返回给函数的调用者。

def fun():
    print(111)
    print(222)
    print(333)
    return 2,3,4
a,b,c = fun()
print(a,b,c)
def my_len():
    count = 0
    for j in l1:
        count += 1
      return count
      return 777
      return [1,2,3]
    return 1,2,3,[22,33],'alexsb'
  ret = my_len()
  print(ret)
print(my_len())

print(len('3243243'))
函数的传参
def my_len(l):  # l 形式参数 形参
    print(l)
    count = 0
    for j in l:
        count += 1
    return count
a = 'fdsafdsafdsagfsadf'
print(my_len(a))  # 实际参数 ,实参
print(my_len([1,2,3]))

实参角度:1,位置传参。按顺序,一一对应

def my_len(l):  # l 形式参数 形参
    print(l)
    count = 0
    for j in l:
        count += 1
    return count
a = 'fdsafdsafdsagfsadf'
print(my_len(a))  # 实际参数 ,实参
print(my_len([1,2,3]))

def func(a,b,c):
    print(a)
    print(b)
    print(c)
func('fdsafdas',3,4)

写一个函数,功能比大小,

def max_min(a,b):
    if a > b:
        return a
    else:
        return b
num1 = int(input('请输入一个数:'))
num2 = int(input('请输入另一个数:'))
print(max_min(num1,num2))

ps: 三元运算

def max_min(a,b):
    if a > b:
        return a
    else:
        return b
print(max_min(100,200))
def max_min(a,b):
    return a if a > b else b
print(max_min(300,200))

关键字传参,不按顺序,一一对应

def max_min(a,b):
    return a if a > b else b
print(max_min(b = 300,a = 200))

混合传参,关键字参数永远在最后面

def func1(a,b,c,d,e):
    print(a)
    print(b)
    print(c)
    print(d)
    print(e)
func1(1,2,d=4,c=3,e=5)
func1(1,4,d=2,c=3,e=5)

按照形参角度

1,位置传参。按顺序,一一对应。
def func(a,b,c):
    print(a)
    print(b)
    print(c)
func('fdsafdas',3,4)

2,默认参数。

def func(a,b=666):  #
    print(a,b)
  func(1,2)
  func(1,777)
func(1,2)
 s = 'alex'.center(30,'*')
 print(s)
 def Infor_entry(username,sex=''):
     with open('name_list',encoding='utf-8',mode='a') as f1:
         f1.write('{}\t{}\n'.format(username,sex))
while True:
    username = input('请输入姓名(男生以1开头)').strip()
    if '1' in username:
        username = username[1:]
        Infor_entry(username)
    else:
        Infor_entry(username,'')



猜你喜欢

转载自www.cnblogs.com/huihuangyan/p/9074413.html