python个人学习复盘

参考资料:DataWhale  专业课本《Python程序设计》

运行环境:Anaconda+Sublime Text3

 

 


01:变量、运算符、数据类型及位运算

 本章为python基础知识。首先理解python中的一切都是对象

python内置对象有:

数字 1234 不可变
字符串 ‘abcd’ 不可变
列表 [1,2,3]  
字典 {1:'food',2:'taste'}  
元组 (0,1,2) 不可变
文件 f=open('data.txt','r')  
集合 set('abc'),{'a','b','c'}  
布尔型 True,False  
空类型 None  
编程单元类型

函数:def定义

类:class定义

 

 

 

 

 

 

 

 

 

 

  

 

运算符挑一些不熟悉的记录一下

x in y; x not in y 成员测试运算符
x is y; x is not y 对象实体同一性测试
|、^、&、<<、>>、~ 位运算符
&、|、^ 集合交集、并集、对称差集
@ 矩阵乘法

 

 

 

 

 

 

位运算符: 计算机内部使用补码表示二进制

 python个人学习复盘_第1张图片

 数据类型转换

转换为整型int(x,base=10)

转换为字符串str(object='')

转换为浮点型float(x)

位运算专题

 

首先弄清楚计算机的原码、反码、补码。

python个人学习复盘_第2张图片 python个人学习复盘_第3张图片

接下来了解位运算符是如何改变数据的补码

位与操作&只有两个对应位都为1时才为1

位或操作|只要两个对应位中有一个1时就为1

位异或操作^只有两个对应位不同时才为1

 位左移a<

位右移a>>i表示a的二进制向右移动i位所得的值

位运算应用

 1.利用位运算实现快速计算

python个人学习复盘_第4张图片

leetcode 习题 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元
素。
尝试使用位运算解决此题。

python个人学习复盘_第5张图片

只有一位数字出现一次,且其他数字都出现两次很关键。异或操作时0与任何数异或为其本身本身自异或时为0,斐波那契式异或为原数。

 02 条件语句

 

python个人学习复盘_第6张图片

单元检测时可使用assert进行单元测试,只有条件为True才能让程序正常工作。 

 python个人学习复盘_第7张图片

 python个人学习复盘_第8张图片

 enumerate(sequence,[start=0]) 枚举对象

python个人学习复盘_第9张图片

枚举可以实现在循环中改变输出内容的编号 

break跳出当前所在层的循环

continue终止本轮循环并开始下一轮循环

python个人学习复盘_第10张图片

循环例题练习:运用if else;elif;while;enumerate;break;continue;

练习一:为DataFrame的某一列增加同一个字符

python个人学习复盘_第11张图片

03异常处理

程序异常的类型有:标准异常、标准警告

检测异常模块:python个人学习复盘_第12张图片

异常体系内部有层次关系:

python个人学习复盘_第13张图片

按模块检测程序错误使Debug 更高效,便于后期维护。

python个人学习复盘_第14张图片

python个人学习复盘_第15张图片

一个try 语句可能包含多个except 子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。 

python个人学习复盘_第16张图片

一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。 

python个人学习复盘_第17张图片

 try-except-finally和try-except-else

python个人学习复盘_第18张图片

不管try子句里面有没有发生异常,finally子句都会执行。

如果一个异常在try子句里被抛出,而又没有任何except把它截住,那么这个异常会在finally子句执行后被抛出。 

 python个人学习复盘_第19张图片

python个人学习复盘_第20张图片

练习题:

1、猜数字游戏
题目描述:
电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示
太小,当用户正好猜中电脑会提示,"恭喜你猜到了这个数是......"。在用户每次猜测之前程序会输出用户是第几次猜
测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。
(尝试使用try catch异常处理结构对输入情况进行处理)
获取随机数采用random模块。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!
# your

 python个人学习复盘_第21张图片

import random
num=random.randint(0,100)
guess=input("you guess num:")
try:
	if guess >num:
		print("bigger")
	elif guess

04列表、元组、字符串

简单数据类型:整型、浮点型、布尔型

容器数据类型:列表、元组、字典、集合、字符串

x=['a','b','c','d']
print(x,type(x))
x1=[1,2,3,4]
print(x1,type(x1))
x2=[0]*5#列表推导式创建列表
print(x2,type(x2))
x3=[0 for i in range(5)]
print(x3,type(x3))
x4=[i for i in range(10)]
print(x4,type(x4))
x5=[i**2 for i in range(1,10)]
print(x5,type(x5))
x6=[i for i in range(100)if i%2!=0 and (i%3)==0]
print(x6,type(x6))
x7=[[1,2,3],[4,5,6],[5,6,7]]
print(x7,type(x7))
for i in x7:
	print(i,type(i))
x=[[0 for col in range(3)]for row in range(4)]#生成三列四行的矩阵
print(x,type(x))
x[1][1]=1
print(x,type(x))

python个人学习复盘_第22张图片

使用append向列表添加元素,extend扩展元素

remove移除列表中某个值的第一个匹配项,pop移除列表中的一个元素,默认为最后一个

append、extend、insert可对列表增加元素,它们没有返回值,而是直接修改了原数据对象。将两个list相加,需要创建新的list对象,从而需要消耗额外的内存,特别是当list较大时,尽量不要使用“+"来添加list

list.count(obj)统计某个元素在列表中出现的次数

list.reverse()反向列表中元素

list.sort(key=None,reverse=False)

1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
1. 在列表的末尾增加元素15
2. 在列表的中间位置插入元素20
3. 将列表[2, 5, 6]合并到lst中
4. 移除列表中索引为3的元素
5. 翻转列表里的所有元素
6. 对列表里的元素进行排序,从小到大一次,从大到小一次

lst=[2,5,6,7,8,9,2,9,9]
lst.append(15)
lst.insert(4,20)
l1=[2,5,6]
lst.extend(l1)
print(lst)
lst.remove(lst[3])
lst.reverse()
lst.sort()
lst.sort(reverse=True)
print(lst)

 2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍

def double_list(lst):
	for index,value in enumerate(lst):
		if isinstance(value,bool):
			continue
		if isinstance(value,(int,float)):
			lst[index]*=2
		if isinstance(value,list):
			double_list(value)

if __name__=='__main__':
	lst=[1,[4,6],True]
	double_list(lst)
	print(lst)


3、leetcode 852题 山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3

k[0]k[i+1]…>k[len(k)−1]

这个$i$就是顶峰索引。

现在,给定一个山脉数组,求顶峰索引。


x.sort(key=lambda a: a[0])
print(x)
# [(1, 3), (2, 2), (3, 4), (4, 1)]

现在,给定一个山脉数组,求顶峰索引。
示例:
输入:[1, 3, 4, 5, 3]
输出:True
输入:[1, 2, 4, 6, 4, 5]
输出:False

 enumerate和isinstance补充

isinstance()函数用于判断一个对象是否是一个已知的类型,与type()的区别如下:

  • tyep()不会认为子类是一种父类类型,不考虑继承关系
  • isinstance()会认为子类是一种父类类型,考虑继承关系

语法:isinstance(object,classinfo)

参数:object为对象,classinfo可以是直接或间接类名、基本类型或者由它们组成的元组

返回值:Ture和False

enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标

语法:enumerate(sequence,[start=0])

元组

元组创建后不可修改,类似字符串

元组有不可更改(immutable)的性质,因此不能直接给元组的元素赋值,但可以更改元组的元素

元组可以使用切片

python个人学习复盘_第23张图片

元组相关的操作符:比较、逻辑、连接、重复、成员关系

元组拼接:用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。

 解压元组

python个人学习复盘_第24张图片

 *rest和*_

python个人学习复盘_第25张图片

练习题:

1.分析下列为什么出现这样的结果

python个人学习复盘_第26张图片

 2、拆包过程是什么?

a,b=1,2
上述过程属于拆包吗? 答:不属于,为赋值。
可迭代对象拆包时,怎么赋值给占位符?python星号(*)的作用

当函数的参数前面有一个星号*时,表示这是一个可变的位置参数,两个星号**表示是可变的关键字参数

字符串 

字符串的切片与拼接

str1 = 'I Love LsgoGroup'
print(str1[:6]) # I Love
print(str1[5]) # e
print(str1[:6] + " 插入的字符串 " + str1[6:])
# I Love 插入的字符串 LsgoGroup
s = 'Python'
print(s) # Python
print(s[2:4]) # th
print(s[-5:-2]) # yth
print(s[2]) # t
print(s[-1]) # n

字符串常用内置方法

python个人学习复盘_第27张图片

 剩下的不列举啦,可查手册了解。

练习题

1、字符串函数回顾
1. 怎么批量替换字符串中的元素?
2. 怎么把字符串按照空格进⾏拆分?
3. 怎么去除字符串⾸位的空格?

str1=" xYy  y Y"
print(str1.capitalize())#首字母转换为大写
print(str1.lower())#全转为小写
print(str1.upper())#全转为大写
print(str1.swapcase())#小转大,大转小
print(str1.replace('Y','hhh'))
print(str1.lstrip())
u="www fisheep com"
u1,u2,u3=u.split(" ",2)
print(u1)
print(u2)
print(u3)


2、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9

def isdigit(string):
	if not string:
		return False
	for item in string:
		if not(48<=ord(item)<=57):
			return False
	return True

if __name__ == '__main__':
	print(isdigit('232'))

3、leetcode 5题 最长回文子串
给定一个字符串 s ,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:

输入: "babad"
输出: "bab"
输入: "cbbd"
输出: "bb"

05字典、集合、序列

数字、字符和元组都能被哈希,因此它们不可变

列表、集合、字典不能被哈希,因此它是可变类型

seq=('name','age','sex')
values=('1','2','3')
dic1=dict.fromkeys(seq)
print("new dict is: %s" % str(dic1))
dict2=dict.fromkeys(seq,10)
print("new dict is: %s" % str(dict2))
dict3=dict.fromkeys(seq,values)
print("new dict is: %s" % str(dict3))
lst=list(dict3.keys())
print(lst)
lst1=list(dict3.values())
print(lst1)
lst2=list(dict3.items())
print(lst2)

if 'name' in dict3:
	print('exist')

dic1={1:"a",2:[1,2]}

dic={'name':'xy','sex':'male','age':22}
dic1={'1':'xyy','2':'male','3':22}
dic1.update(dic)
print("update dic: %s" % dic1)

练习题

dic = {'python': 95,'java': 99,'c': 100}

1. 字典的长度是多少
2. 请修改'java' 这个key对应的value值为98
3. 删除 c 这个key
4. 增加一个key-value对,key值为 php, value是90
5. 获取所有的key值,存储在列表里
6. 获取所有的value值,存储在列表里
7. 判断 javascript 是否在字典中
8. 获得字典里所有value 的和
9. 获取字典里最大的value
10. 获取字典里最小的value
11. 字典 dic1 = {'php': 97}, 将dic1的数据更新到dic中

dic={'python':95,'java':99,'c':100}
print(len(dic))
dic['java']=98
print(dic)
print(dic.pop('c','100'),dic)
dic1={'php':90}
dic.update(dic1)
print(dic)
print(dic.keys())
print(dic.values())
if 'javascript' in dic:
	print('exist')
else:
	print('error')
s=0
max1=0
temp=0
for i in dic.values():
	s=s+i
	if max1<=i:
		temp=i
		max1=temp
	else:
		print(max1)
print(s)
print(min(dic.values()))

 2、字典中的value
有一个字典,保存的是学生各个编程语言的成绩,内容如下

data = {
'python': {'上学期': '90', '下学期': '95'},
'c++': ['95', '96', '97'],
'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
}


各门课程的考试成绩存储方式并不相同,有的用字典,有的用列表,但是分数都是字符串类型,请实现函
数transfer_score(score_dict) ,将分数修改成int类型

import pprint

def transfer_score(data):
	if isinstance(data,dict):
		for key,value in data.items():
			data[key]=transfer_score(value)
		return data

	if isinstance(data,list):
		data_lst=[]
		for item in data:
			data_lst.append(transfer_score(item))
		return data_lst

	if isinstance(data,str):
		return int(data)

if __name__ == '__main__':
	data = {
'python': {'last': '90', 'next': '95'},
'c++': ['95', '96', '97'],
'java': [{'month':'90', 'middle': '94', 'final': '98'}]
}

data=transfer_score(data)
pprint.pprint(data)
print(data['python'])

 

集合的创建

1. 先创建对象再加入元素。
2. 在创建空集合的时候只能使用s = set() ,因为s = {} 创建的是空字典。

3.使用set(value) 工厂函数,把列表或元组转换成集合。

由于 set 存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取
集合中元素的值,但是可以判断一个元素是否在集合中。

 

练习题

1. 怎么表示只包含⼀个数字1的元组。
2. 创建一个空集合,增加 {‘x’,‘y’,‘z’} 三个元素。
3. 列表['A', 'B', 'A', 'B']去重。
4. 求两个集合{6, 7, 8},{7, 8, 9}中不重复的元素(差集指的是两个集合交集外的部分)。
5. 求{'A', 'B', 'C'}中元素在 {'B', 'C', 'D'}中出现的次数。

s=(1,)
print(type(s))
newset=set()
newset.add('x')
newset.add('y')
newset.add('z')
lst=['A','B','A','B']
newset=set(lst)
print(newset)
a={6,7,8}
b={7,8,9}
print(a-b)

序列

 

#list(sub)把一个可迭代对象转换为列表
#tuple(sub)把一个可迭代对象转换为元组
#str(obj)把obj对象转换为字符串
#len(s)返回对象(字符、列表、元组等)长度或元素个数
a=list()
print(a)
b='I Love LS'	
b=list(b)
print(b)

1. 怎么找出序列中的最⼤、⼩值?
2. sort() 和 sorted() 区别
3. 怎么快速求 1 到 100 所有整数相加之和?
4. 求列表 [2,3,4,5] 中每个元素的立方根。
5. 将[‘x’,‘y’,‘z’] 和 [1,2,3] 转成 [(‘x’,1),(‘y’,2),(‘z’,3)] 的形式。 

a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
zipped=zip(a,b)
print(tuple(zipped))
print(max(a))
print(min(a))
print(sum(c))

seasons=['Spring','Summer','Fall','Winter']
a=list(enumerate(seasons))
b=list(enumerate(seasons,1))
for i,element in a:
	print('{0},{1}'.format(i,element))
a=[2,4,3,6,8,2]
print(sorted(a))
a.sort() 
print(a)

1. sorted(iterable, key=None, reverse=False) 对所有可迭代的对象进行排序操作。
a. iterable -- 可迭代对象。
b. key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可
迭代对象中的一个元素来进行排序。
c. reverse -- 排序规则, reverse = True 降序 , reverse = False 升序(默认)。
d. 返回重新排序的列表。

2.sort方法对list排序会修改list本身,不会返回新list

06 函数与Lambda表达式

参数的类型:

位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合

def argtest(name,age=9):
	print('Name:{0},Age:{1}'.format(name,age))

argtest('xyy')

def test(arg1, *,nkw,**kw):
	print(arg1)
	print(nkw)
	print(kw)

test(70,nkw=10,a=1,b=2)

 变量作用域、内嵌函数

num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num) # 1
num = 123
print(num) # 123
fun1()
print(num) # 123

def outer():
print('outer函数在这被调用')
def inner():
print('inner函数在这被调用')
inner() # 该函数只能在outer函数内部被调用
outer()
# outer函数在这被调用
# inner函数在这被调用

Lambda表达式

 

练习题

1. 怎么给函数编写⽂档?
2. 怎么给函数参数和返回值注解?
3. 闭包中,怎么对数字、字符串、元组等不可变元素更新。
4. 分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)

a=[[6, 5], [3, 7], [2, 8]]
x = sorted(a, key=lambda a: a[0], reverse=False)
print("按照首元素大小正序排列:"+str(x))
x = sorted(a, key=lambda a: a[0], reverse=True)
print("按照首元素大小逆序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=False)
print("按照尾元素大小正序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=True)
print("按照尾元素大小逆序排列:"+str(x))


5. 利用python解决汉诺塔问题?有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c
柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)

def Tower_of_Hanoi(n,a,b,c):
    if n == 1:
        print(a, "-->", c)
        return 0
    Tower_of_Hanoi(n-1,a,c,b)
    print(a, "-->", c)
    Tower_of_Hanoi(n-1,b,a,c)
Tower_of_Hanoi(64,'A','B','C')

 

 07类、对象与魔法方法

 继承:子类自动共享父类之间数据和方法的机制

多态:不同对象对同一方法响应不同的行动

class Turtle:
	color='green'
	weight=10
	legs=4
	shell=True 
	mouth='big mouth'

	def climb():
		print("climb ya,climb")
	def bite(self):
		print("bite ya,bite")
	class Sonclass:
		"""docstring for sonclass"""
		def son():
			print("son methods")
				
tt=Turtle
tt.climb()
tt1=Turtle.Sonclass
tt1.son()

类与魔法方法

class Ball:
	def setName(self,name):
		self.name=name

	def kick(self):
		print("i am %s,who? who hit me..." % self.name)

a=Ball()
a.setName("ballA")
a.kick()
#类有一个名为__init__(self[, param1, param2...])
#的魔法方法,该方法在类实例化时会自动调用。
class Ball:
	def __init__(self,name):
		self.name=name
	def kick(self):
		print("i am %s,who hit me..." % self.name)
b=Ball('ballB')
b.kick()

class Site:
	def __init__(self,name,url):
		self.name=name
		self.__url=url
	def who(self):
		print('name:',self.name)
		print('url',self.__url)
	def __foo(self):
		print('it is private')
	def foo(self):
		print("it is public")
		self.__foo()#类里通过对象访问私有方法
c=Site('xyy','www.hhh.com')
c.who()
c.foo()
c.__foo()

类的继承

class people:
	name=''
	age=0
	__weight=0

	def __init__(self,n,a,w):
		self.name=n
		self.age=a
		self.__weight=w

	def speak(self):
		print("%s say that: i am %d years old" %(self.name,self.age))

class student(people):
	grade=''

	def __init__(self,n,a,w,g):
		people.__init__(self,n,a,w)
		self.grade=g

	def speak(self):
		print("%s say that: i am %d years old,i am in %d grade" %(self.name,self.age,self.grade))
s=student('xyy',13,48,3)
s.speak()

08 模块与datetime模块

python个人学习复盘_第28张图片

1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?

import xx
dir(xx)
help(xx)


2、了解Collection模块,编写程序以查询给定列表中最常见的元素。
题目说明:
输入:language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
输出:Python
 

from collections import Counter

language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
word=Counter(language)
print(word.most_common(1))

09文件与文件系统

 

f=open('file')
print(f)
print('FileName:',f.name)

for each in f:
	print(each)

f=open('file','r')
line=f.read(20)
print("str:%s" %line)
f.close()
  • fileObject.tell() 返回文件的当前位置,即文件指针当前位置。
  • fileObject.seek(offset[, whence]) 用于移动文件读取指针到指定位置。

        a. offset :开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
        b. whence :可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开
        头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。

  • fileObject.write(str) 用于向文件中写入指定字符串,返回的是写入的字符长度。
  • fileObject.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的
    换行符\n 。

练习题

1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?
2、编写程序查找最长的单词
输入文档: res/test.txt

你可能感兴趣的:(数据分析)