【针对性复习】Python

愿我们相会于
    世界腾飞之时!

目录

  • Python概念
  • 基本语法
  • 序列和字典
  • 深浅拷贝
  • Python文件的操作

Python是什么?

Python之禅:The Zen of python!   <Beautiful is better than ugly.>

1、#pip:包管理器  .maven/yum

import qrcode //qrcode,默认是没有的,第三方库-----

qrcode.make('今天要放假啦').save('./text.png') qrcode:生成为二维码 \

ps: python 动态类型的编程语言,在编译过程中类型可以发生改变

2、#print/type 内建函数

   #字符串前面加一个r表示原始字符串(raw_string)字符串内部的转义字符不生效;
name=r"my 'name' '' 'is 'ranxiaoxi' "

name ="abcdef"

print(name[-3])
    #字符串下标可以取负数 -1=len-1 <下标不可以越界>

print(name[1:3])
    #取字符串子串.1:3[1,3)区间 ----切片操作(slice);

print('='*30) 打印分割线
    #Python只有字符串类型,没有字符类型
    #布尔类型也是一种特殊的类型,

value=true

print(type(value)) // 打印类型
    # Python同样遵守短路求值《概念了解》
    #Python中没有++/-- 这样的操作
    #python中的列表(list)中存的元素可以是任意类型的,

list(列表):a=[9,2,3,'haha',[2,4],6]
    #元组(tuple),列表是可变对象,元组是不可变对象
tuple(元组):a=(1,3,4,5,6,"haha")
    #字典 :a{ }
a={
#键值对:
   'ip':'127.0.0.1' #环回IP
    'port':80
}

a=1

b=2
print(a/b)

#列表(list)

a=[1,2,4,5,3,6]
a[0]=99
print(a)

#元组(tuple)
#列表是可变对象,元组是不可变对象
    #不可变对象有一个好处就是“线程安全”!

a=(1,2,3,"haha",7)
#字典
a={
   'ip':'127.0.0.1' #环回IP
}

print(a['ip'])

#id这个内建函数,查看变量的“地址”

a='haha'
a=b
print(id(a))
print(id(b))

#代码块缩进
result = input('你愿意认真运动吗? 1 表示愿意 0 表示不愿意')
if result == '1':
    print('你会有好身材!')
elif result == '0':
    print('你会变胖的')
else:
    print('输入有误!!!') 

 #while循环
num=1
while num<=10:
    print(num)
    num += 1  
for num in range(0,11):
    print(num) 
a={'ip':'127.0.0.1','port':80}

for key in a:  #前闭后开区间

    print(key,a[key])

    #python中同名函数会相互覆盖,没有重载这样的规则
    #一个函数可以返回多个值

读操作:
f = open('d:/test.txt','r')

#返回一个列表
#a=f.readlines()
for line in f:
   print(line,end='')
f.close()

写操作:
f = open('d:/test.txt','w')
f.write('hello world!')
f.close()

#shell文件操作是更简单的.

f = open('d:/test.txt','r')
word_dict={}
for word in f:
    #strip str的方法,功能是去掉字符串的头和尾的空白字符
    #空白字符:空格,制表符,换行符,垂直制表符,翻页符...

    word = word.strip()
    if word in word_dict:
        word_dict[word]+=1
    else:
        word_dict[word]=1
f.close()

print(word_dict)

3、模块:

  • 通过import关键字,引用其他.py文件的代码

  • 被引入的代码文件,被称之为“模块”

  • 去掉 .py 后缀名,就是模块名

4、语句折行:

双引号和单引号都不能折行,但是三引号可以折行使用

5、python关键字:

_xxx表示一个python的“私有变量”

6、对象和类型

  • 一切都是对象

  • python中任何类型的值其实都是一个对象判断一个东西是否是对象时(就尝试用id去一下看能否取到)

  • 类型也可以是对象

  • python是纯粹的面向对象

7、【深浅拷贝】

浅拷贝是指, 虽然我重新创建了一个新对象, 但是新对象里面包含的子对象, 和原来的子对象是同一个对象.

深拷贝就是指, 重新创建了一个新对象, 同时这个新对象的子对象, 也都是重新创建了一份新的深拷贝对象.

深拷贝通过 copy.deepcopy 来完成;但是对于可变对象(list、dict)才能深拷贝,而对于不可变对象,只能浅拷贝
import copy

a=[1,3,2]
b=copy.deepcopy(a)
a[0]=99
print(a) #[99,3,2]
print(b) #[1,3,2]-----改动a不会影响到b的结果<深拷贝的含义>

理解对象和类型:

  • 相同的类型的对象, 须有相同的操作. 比如, 所有的整数对象, 都可以进行加减乘除操作. 所有的字符串都可以使用切片操作.

  • Python是一种 动态强类型 编程语言.

  • 动态类型是指运行时进行变量类型检查;静态类型:一个变量在运行过程中类型不可以发生改变; 强类型 指类型检查严格, 并且"偏向于"不允许隐式转换.

  • 类似的, C语言是一种静态弱类型语言. Java的类型检查更为严格, 一般认为是静态强类型, 而Javascript则是动态弱类型。

标准类型

  • 整型

  • 浮点

  • 复数型

  • 布尔型

  • 字符串

  • 列表

  • 元组

  • 字典

其他内建类型

  • 类型

a=20
    #type就是一个对象,这个对象的类型就是一个type类型。
b=type(a)
print(b)
  • Null对象(None)

  • 文件

  • 函数

  • 模块

内建类型的布尔值

所有的标准对象, 均可以用于布尔测试(放到if条件中).

下列对象的布尔值是False

  • None

  • False

  • 所有值为0的数字(0, 0.0, 0.0 + 0.0j)

  • "" (空字符串)

  • [] (空列表)

  • () (空元组)

  • {} (空字典)

if {}: #空字典为False
    print('heihei')
else:
    print('haha')

类型工厂函数   vs  单例模式

  • int() ,float(),complex()这都是内建函数

单例模式的特点:

  • 单例类只能有一个实例

  • 单例类必须自己创建自己的唯一实例

  • 单例类必须给所有其他对象提供这一对象实例
  • 单例模式常见的写法有: 懒汉式单例,饿汉式单例

Python不支持的类型

  • char, byte: 可以使用长度为1的字符串, 或者整数代替;

  • 指针: Python替你管理内存, 虽然id()返回的值接近于指针的地址, 但是并不能主动去修改;

  • int/short/long: 以前版本的Python中也是区分int和long的, 但是后来统一在一起了; 记住Python中的整数表示的范围, 只取决于你机器内存的大小.

  • float/double: Python的flfloat其实就是C语言的double. Python设计者认为没必要支持两种浮点数.

常用内置函数/模块

import math
#print(math.pi)
for i in range(0,10):
    print(round(math.pi,i)) #round:对浮点数进行四舍五入,round有两个参数,一个是要进行运算的值,第二个是保留的小数点后的位数
import random 
#随机种子
print(random.randint(1,6))

函数和可调用对象

def outer():
    def inner():
        print('haha')
    inner()

#函数也是一个对象,“可调用对象”
outer()

函数的参数

def add(x,y):
    return x+y
print(add('hello',' world'))
print(add([1,2],[3,4]))
print(add(11,23))

def log(*data):    #*data表示多个参数
    for i in data:
        print(i,end='、')
log(11,12,13)

def log(**data):        #**data相当于字典
    for key in data:
        print(key,data[key])
log(x=1,y=2,z=3)

关键字参数

def print_point(x=0,y=0,z=0):
    print(x,y,z)
print_point(x=99,z=98)

print(10,20,end='',sep='-')

自定制排序规则:

a=[1,4,9,6,2]
b1=sorted(a)                 #升序排列
b2=sorted(a, reverse=True)   #降序排列
print(a,b1)
print(a,b2)

序列类型操作符

  • 连接操作符(+): 把两个相同类型的序列进行连接.

连接操作符往往并不高效(新创建对象, 把原有对象拷贝进去). 对于列表, 推荐使用extend来完成这样的操作; 对于字符串, 推荐使用join这样的方法.

a=['aaa','bbb','ccc']
result = '-'.join(a)
print(result)
a='hesolp'
print(sorted(a))
print(''.join(sorted(a)))

重复操作符(*):让一个序列重复N次

a=[1,2,3,4]

print(a*10)
a=[1,2,3,4,5,6,7,8]
print(a[::-1])      #逆序打印

print(a[::2])
print(a[::4])
print(a[::1])

序列内建函数:

  • enumerate: 同时枚举出序列的下标和值. 这个是一个非常有用的函数, 可以避免很多丑陋的代码.

回忆我们之前写过的, 找出元素在列表中的下标.

def Find(input_list, x):
for i in range(0, len(input_list)):
if input_list[i] == x:
    return i
else:
    return None

这里我们的for循环写的就不够优雅, 使用enumerate可以得到一种更优雅的写法.

def Find(input_list, x):
for i, item in enumerate(input_list):
if item == x:
    return i
else:
    return None
  • zip: 这个函数的本意是 "拉链", 我们先看代码.

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9, 10]
print(zip(x, y, z))

# 执行结果
[(1, 4, 7),
 (2, 5, 8),
 (3, 6, 9)]
  • zip其实可以理解成矩阵的行列互换。

  • zip的一个比较常见的用法,就是构造字典。

 


0、erlang特别适用于并发的场景

1、

a=10
s=f'a={a}'

print(s) //字符串的转换

2、python原始字符串:<raw,原始的>

a=r'hello\n world'
print(a)
    C++ 原始字符串:R"(hello)"

3、字符居中,排版适用

a='hello'
print('['+a.center(60)+']')
print('['+a.ljust(50)+']')
print('['+a.rjust(50)+']') #中左右对齐

4、字符串切分

a='hello world haha heihei'
print(a.split(' ')) #空格分隔

a='hello world haha heihei'
b=a.split(' ')
print(';'.join(b)) #分号分割

5、关于列表

    #字符串只能由字符组成,而且不可变;列表可以包括任意类型的对象,是可变的。

6、append(插入)

a=[1,2,3,4]
a.append([5,6])   #append追加操作,将5追加到列表末尾
print(a)
print(len(a))

7、删除

a=[1,2,3,4]
del(a[1])   #可以删除任意位置的元素(按下标删除)
a.remove(2) #删除元素(按值删除,有多个相同的元素,删除第一出现的元素)时间复杂度O(N)
print(a)

8、排序

a=[1,2,3,6,4]
print(sorted(a))
print(a.sort()) #会修改原列表

print(a)

9、基于列表的堆栈

a=[1,2,4,3]
a.append(5) #push操作
print(a)
a.pop(0)
print(a)

10、元组的使用:

  • 由于元组不可变,所以不支持append、extend、sort等修改自身的操作

  • 元组的不可变指的是元组的每个元素的id不可变,就是说元组内部包含着可变对象,这样的可变对象是能修改的,但是该对象的id是不能发生变化的

  • 你有一个列表, 现在需要调用一个API进行一些处理. 但是你有不是特别确认这个API是否会把你的列表数据弄乱. 那么这时候传一个元组就安全很多.

  • 我们马上要讲的字典, 是一个键值对结构. 要求字典的键必须是 "hash对象" (字典本质上也是一个hash). 而一个可hash对象的前提就是不可变. 因此元组可以作为字典的键, 但是列表不行.

a=([1,2],[3,4])
a[0][0]=99
print(a)



a=(1,2,3)
a=a+(4, )  #元组的插入
a=a+(4)   #这样的操作是错误的!!!切记
print(a)   

11、字典:字典存的是键值对结构,其中键必须是不可变对象 && 可哈希。<可变对象一般是不能哈希的>

a={
   'ip':'127.0.0.1',
   'port':80
  }
a['port']=100
a['hello']=11 #存在即修改,不存在即插入
print(a)


a={
   'ip':'127.0.0.1',
   'port':80
    }
print(a['port'])
for key in a:
    print(key,a[key])
print(a.keys())
print(a.values())
print(a.items())
  • 如果直接对字典进行赋值操作,可以直接取key来设置;如果只能查找操作,最好先判定key是否在字典中存在存在即取值,不存在抛异常;

  • len: 字典中键值对的数目

  • hash: 判定一个对象是否可hash. 如果可hash, 则返回hash之后的hashcode,否则运行出错

12、集合

集合是基于字典实现的一个数据结构,集合数据结构实现了很多数学中的交集、并集、差集等方法。

a=set([1,2,3])
b=set([3,2,1])
print(a == b) #集合的概念和顺序无关


a=set([1,2,3,3,2])
print(a) #集合不可以重复,打印{1,2,3}

a=([1,2,3,3,2])
b=list(set(a)) #将a构造成集合,list成列表
print(b)

Python文件的操作

1、文件具备随机访问能力,这个过程是通过操作文件指针完成的。

import os.path
my_path='d:/aa/bb/cc.txt'


print(os.path.basename(my_path))  #可获取到文件名
print(os.path.dirname(my_path))
print(os.path.split(my_path))   #可分离出扩展名
print(os.path.splitext(my_path))  #可分离出文件后缀名
【测试压缩文件的测试用例,分离出不同类型的文件】

2、walk(),生成一个目录下的所有文件名

import os
my_path='d:/aa'
for item in os.walk(my_path):
    print(item)

#按路径打印
import os.path as op
import os
my_path='d:/aa'

#把目录下所有的文件打印出来
for base_path,_,files in os.walk(my_path):
    for f in files:
        print(op.join(base_path,f))

3、捕捉异常

(一)

try:
    a=[1,2,3]
    print(a[100])
except IndexError as e:
    #print(type(e))
    print(e)
else:
    print('没有异常发生')

(二)
try:
    a=[1,2,3]
    prin(a[1])
except Exception as e: #Exception 所有异常的集合表示
    print('出现异常了')
else:
    print('没有异常发生')

(三)
#pylint 代码静态检查工具
def devide(x,y):
    if y == 0:
        #raise 10
        raise Exception('divide zero except')
    return x/y
try:
    devide(10,0)
except Exception as e:
    print(e)
def test():
    divide(10,0)
try:
    test()
except:
    print('捕获异常')

4、with就是try  except  finally的简化写法(看课件)

5、Python在查找模块的时候,在指定目录中查找的

import sys
for path in sys.path:
    print(path)

6、import语句

import sys
import os
def func():
    import os.path
    ret = os.path.exists('d:/aa.txt')
    print(ret)
func()

#import是导入整个模块
#from import 导入模块中的指定名字
import sys
import os.path as op
def func():
    ret = op.exists('d:/aa.txt')
    print(ret)
func()

下面两个含义一样的,但是用法不一样。

from os.path import *---不建议使用,用谁就导入谁
import os.path

7、模块的内置变量

print gllobals() #打印全局变量
if __name__ == '__main__':

    #以下这部分代码是可以作为测试代码:
    #如果 calc 是作为一个模块被其他文件调用的话,就不需要执行这部分代码了
    #如果直接执行 calc 文件,那么此时测试代码就可以被执行到

print(add(10,20))
print(sub(10,20))
print(mul(10,20))
print(divide(10,20))
__builtins__ : 内建函数模块. 包含了open, help, doc等内建函数的定义
__name__ : 模块名字. 如果是从这个模块开始执行, 那么 __name__ 值为 __main__
__file__ : 模块的文件名
__doc__ : 模块的文档字符串
__package__ :模块从属的包名

8、包(package)

  • 所谓包就是一个特殊的目录

  • 里面必须包含一个 __init__ .py 文件

  • 这个文件负责对包进行初始化

import calc_math.calc

print(calc_math.calc.add(10,20))

9、sys模块

  • sys.executable: Python解释器的绝对路径.

  • sys.exit(): 退出Python.

  • sys.getsizeof(): 获取一个对象占用的内存空间大小(字节)

  • sys.modules: 一个字典对象, 描述了当前程序都加载了哪些模块(模块名为key, 模块对象为value).

  • sys.path: 模块查找路径, 一个列表.

  • sys..platform:一个字符串的对象,操作系统标识符。

10、os模块(混杂的操作系统接口,跨平台的能力)

  • 进程信息

11、Python面向对象编程(OOP)

  • 面向过程:编年史

  • 面向对象:记传史

  • python中的对象包含三个部分:id ,类型,值。

12、封装和接口

  • 封装就是让类的调用者不需要了解类的实现者是怎么实现的。封装是为了让调用者使用起来更方便,成本更低。例如:手机通话是怎样实现的?

class Test:
    """
    这是一个用来测试类创建语法的类
    """
    def Print(self):

        '''
        实例方法:成员函数/普通函数
        '''
        print('hello')
test = Test()
test.Print()
Test.Print(test)
  • 接口就是类的实现者提供给类的调用者去使用的内容。

13、组合/包含

  • 组合:has-a 语义

  • 组合的目的就是,代码复用

14、继承/派生

  • 继承: is-a

  • 继承的目的还是,代码复用

组合的场景远远多于继承!

15、多态

  • 多态是封装的更进一步,调用者既不需要知道实现者是怎么实现的,也不需要知道实现者实现的这个类是什么类型的。

16、自省/反射

17、属性和方法

创建类:

class Test:
    """
    这是一个用来测试类创建语法的类
    """
    def Print(self):
        '''
        实例方法:成员函数/普通函数
        '''
        print('hello')

test = Test()
test.Print()
Test.Print(test)

18、属性的访问权限

  • Python中使用双下划线(__xxx)前缀来表示私有成员;

19、继承

  • 子类可以继承父类的属性和方法

  • 父类和子类中出现同名方法或者属性的时候,子类会覆盖父类的属性和方法;

  • 没有显示调用父类构造器,执行报错。

class Parent(object):
    def __init__(self):
        self.x = 100
class Child(Parent):
    def __init__(self):
        Parent.__init__(self)   # 显式调用父类的方法.
        self.y = 200

p = Parent()
print(p.x)
c = Child()
print(c.x)

19、Python中继承和多态没有太多的联系

  • Python中的多态就是从函数实现这角度看,并不知道具体类型,只知道可以实现某种功能,不管是啥类型都可以在一起操作

  • 基于'鸭子类型'的多态----更加广义的多态

20、类和实例的常用内建函数

  • issubclass:判定一个类是否是另外个类的子类;

  • isinstance:判定一个对象是否是一个类的实例;

  • hasattr,getattr,setattr,delattr:用来对一个类/对象的属性进行操作和判定;

  • dir:查看类/对象的所有属性和方法;

  • vars:和dir 类似,不过vars 将值取出来了;

  • supper:获取当前类/对象的父类;super本质上也是一个工厂函数,创建一个父类的对象。

 21、特殊方法指定类

class Time(object):
    def __init__(self,hour,min):
        self.hour = hour
        self.min = min

    def __str__(self):
        return f"{self.hour}:{self.min}"

    def __len__(self):
        return len(f"{self.hour}:{self.min}")

t = Time(12,32)
print(t) #打印时间
print(len(t))

~未完待续~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值