python课程笔记

一、python

1.计算机组成

在这里插入图片描述

CPU:处理指令、运算数据
内存:临时存储CPU运算的数据

2.了解python

2.1、特点

①简单、易学
②开源、免费
③应用领域广泛:网络爬虫、数据分析、人工智能、机器学习、web开发、自动化测试、自动化运维

2.2、版本号

·python 2.x
·python 3.x
python 3.5
python 3.6
python 3.7

2.3、python基础学习路线

在这里插入图片描述

二、python入门

2.1、环境搭建

2.1.1、python解释器

作用:运行文件
python 解释器的种类
①CPython,C语言开发的解释器
②IPython,基于CPython的一种交互式解释器
③其他解释器
PYPY,基于Python语言开发的解释器
Jython,运行在Java平台的解释器,直接把Python代码编译成Java字节码执行
IronPython,运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码
课程中使用的解释器:CPython

2.1.2、下载python解释器

下载地址:https://www.python.org/downloads/release/python-372/

2.1.3、PyCharm

PyCharm 是一种Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,内部集成的功能如下:
PyCharm分为专业版(professional)和社区版(community)
下载链接:http://www.jetbrains.com/pycharm/download/#section=windows

PyCharm交互式开发:点击左下角Python Control

2.1.4、注释

注释分为两类:单行注释和多行注释

单行注释:#单行注释 ctrl+/
多行注释:“”“多行注释 “”” 或者 ‘’‘多行注释 ‘’’(6个单引号或6个双引号)


2.2、变量

变量就是存储数据的时候当前数据所在内存地址的名字
a=1
b=1.1

1、标识符的命名规则:
①由数组、字母、下划线组成
②不能以数字开头
③不能使用内置关键字
④严格区分大小写

2、命名习惯:
①见名知义
②大驼峰
③小驼峰
④下划线


2.3、debug

所谓bug,就是程序中的错误。

debug工具使用步骤:①打断点②debug调试

1、打断点
单击行号位置

2、debug调试
以debug方式运行


2.4、数据类型

7种:
在这里插入图片描述
检测数据类型用type(数据)
字符串数据带引号
a=‘myname’
print(type(a))

list列表 b=[10,20,30]
tuple 元组 b=(10,20,30)
set集合 b={10,20,30}
dict字典 b={'id':'123' , 'name':'myname'} 与键值对相似


2.5、输出

格式化输出
格式化输出
f-字符串
print的结束符

1、格式化输出
在这里插入图片描述

name='myname'
print('我的名字是%s,你好'  %name)

%.2f 小数点后面保留两位小数

%03d 3位数,不足的话以0补全,超出的原样输出,用以实现数字对齐功能

%(id+1,name)用以实现多个变量的输出

%s功能比较强大,可以输出整型和浮点型

f 格式化字符串(推荐使用) f’{表达式}’

name = 'myname'
print(f'我叫{name}')
'''
python print对齐
1、使用%格式按列对齐打印输出
2、使用format()函数按列对齐打印输出
3、使用f-string按列对齐打印输出
4、使用字符串函数按列对齐打印输出,ljsut,rjust,center,
'''
# 使用%格式按列对齐打印输出  *定义宽度 -代表左对齐
print('*'*10+'%格式'+'*'*10)
print('正常输出====%s===='%('name'))
print('左对齐,name占8位====%-*s===='%(8,'name'))
print('name占8位====%*s===='%(8,'name'))
# format :<n左对齐   :>n右对齐   :^n居中对齐  n是宽度  写在{}里面
print('*'*10+'format格式'+'*'*10)
print("正常输出===={key}====".format(key='name'))
print("8位左对齐===={:<8}====".format('name'))
print("8位左对齐===={key:<8}====".format(key='name'))
print("8位居中对齐===={key:^8}====".format(key='name'))
# f和format类似 :>n右对齐 :^n居中对齐 n是宽度 写在{}里面 默认空格填充,指定填充内容加在冒号后面添加字符
print('*'*10+'f格式'+'*'*10)
key = 'name'
print(f"8位左对齐{
     key:<8}")
print(f"8位左对齐,用字符0填充{
     '111':0<8}")
# 字符串函数ljust rjust center zfill
print('*'*10+'字符串函数格式'+'*'*10)
print('左对齐20位'.ljust(20,'-'))
print('右对齐20位'.rjust(20,'-'))
print('居中对齐20位'.center(20,'-'))
print('20位,不足以0填充'.zfill(20))

'''
**********%格式**********
正常输出====name====
左对齐,name占8位====name    ====
name占8位====    name====
**********format格式**********
正常输出====name====
8位左对齐====name    ====
8位左对齐====name    ====
8位居中对齐====  name  ====
**********f格式**********
8位左对齐name
8位左对齐,用字符0填充11100000
**********字符串函数格式**********
左对齐20位--------------
--------------右对齐20位
------居中对齐20位-------
000000000020位,不足以0填充
'''

2、转义字符
在这里插入图片描述
print(‘我叫/n张三’)

3、print结束符
print('输出',end="\n") 默认结束符号是\n, end=可以是其他的结束符号


2.6、输入

1、语法

a = input("提示信息")

特点:
①当程序执行到input,等待输入,输入完成之后再向下执行
②input接受到用户输入后,一般存储到变量,方便使用
③input会把接收到的数据都当作字符串处理


2.7、数据类型转换

数据类型转换函数:
在这里插入图片描述

# ord:将字符转换为ASCII编码
int_1 = ord('m')
int_2 = ord('n')
int_3 = ord('你') 
print(int_1, int_2, int_3)  # 109 110 20320

# chr:将整数转换为Unicode字符
str_1 = chr(109)
str_2 = chr(110)
print(str_1, str_2) # m n

# bin:将十进制转换为二进制 0b是二进制符 bin输出的是字符串, 字符串是不能使用左移右移的
bin_1 = bin(16)
print(bin_1, type(bin_1))  # 0b10000 str 

# oct:十进制转换为八进制,输出字符串
print(oct(100)) # 0o144

# hex:十进制转换为十六进制
print(hex(100))  # 0x64

# <<左移  >>右移
# 16左移两位
16<<2
print(16<<2)  # 64
print(0b10000<<2)  # 64
# print(bin_1<<2) # 会报错字符串不能位移

# int(x, base) 其他进制转换为十进制, base代表进制数,x是字符串
# 0b:二进制
# 0x:十六进制
# 0o:八进制
print(int('0b10000', 2))  # 16
print(int('10000', 8))  # 4090
print(int('10000', 16)) # 65536

# format也可以进行格式抓换
print('十六进制转换为二进制', format(0x10, '0b'))  # 十六进制转换为二进制 10000
print('十进制转换为二进制', format(10, '0b')) # 十进制转换为二进制 1010
print('二进制转换为十六进制', format(0b1000000000, '0x'))  # 二进制转换为十六进制 200

# eval其他进制转换为十进制
print('八进制转换成十进制', eval('0o10000')) # 八进制转换成十进制 4096

# eval可以将字符串转换成表达式或函数调用
def test_1():
    return 'test_1'

def test_2():
    return 'test_2'

num = 2
print(eval('test_' + str(num) + '()'))  # test_2
print(eval('num + 3')) # 5

2.8、运算符

运算符的分类(五大类):
算术运算符
赋值运算符
复合赋值运算符
比较运算符
逻辑运算符

1、算术运算符
在这里插入图片描述
2、赋值运算符
多个变量赋值

a,b,c = 1,2,'ccc'

多个变量赋相同值

a=b=1

3、复合赋值运算符

在这里插入图片描述
4、比较运算符(关系运算符)
在这里插入图片描述
5、逻辑运算符

在这里插入图片描述

(a<b)and(b<c)

数字之间的逻辑运算:
and运算符,只要有一个值为0,则结果为0,否则结果为最后一个非0数字
or运算符,只有所有值为0结果才为0,否则结果为第一个非0数字


三、流程控制

3.1、条件语句

1、if语法
多重条件

if  条件1:
		条件成立执行的代码片段1
		条件成立执行的代码片段2
		。。。。。。
else 条件2:
		条件不成立执行的代码1
		条件不成立执行的代码2
		。。。。。。
。。。。。。
else:
		条件不成立执行的代码1
		条件不成立执行的代码2
if   a>b:
			print('a>b')

if嵌套

if  条件1:
		条件成立执行的代码片段1
		条件成立执行的代码片段2
		。。。。。。
		if  条件2:
				条件成立执行的代码片段1
				条件成立执行的代码片段2

注意:条件成立执行带缩进的代码,不带缩进这不属于if语句

2、三目运算符
语法:
条件成立的表达式 if 条件 else 条件不成立执行的表达式

a+1  if  a>b  else  b+1

3.2、随机数

import  random
random.randint(0,10)

3.3、循环

while循环和for循环

1、while循环

while    条件1:
		条件成立代码片段1
		条件成立代码片段2
		。。。。。。
		while    条件2:
				条件成立代码片段1
				条件成立代码片段2
				。。。。。。
else :
		循环正常结束之后执行的代码 

else当循环正常结束之后执行的代码
如果用break终止循环,else代码块不执行
如果用continue终止循环,else代码块正常执行

i = 0
while i<5:
		print('')
		i+=1

2、break和continue
break终止循环
continue终止当前循环,执行下一次循环

3、for循环

for  临时变量   in  序列:
		重复执行的代码1
		重复执行的代码2
		。。。。。。
else :
       循环正常结束之后执行的代码块

3.4、迭代器Iterator和生成器generator

3.4.1、迭代器interator

迭代器:一种惰性获取数据项的方式,当访问一个较大的数据集时,按需一次获取一个数据项。
在Python中,可直接作用于for循环的对象都称为可迭代对象,可迭代对象的数据类型有下面两类:
①集合类型数据,str、list、tuple、dict、set等。
②生成器,包含生成器和带yield的生成器函数。
可迭代对象不一定是迭代器,但迭代器一定是可迭代对象。
str、list、tuple、dict、set都是可迭代对象iterable,但不是迭代器iterator,可以通过迭代器中的iter()函数把这些可迭代对象转换成迭代器。
迭代器中有两个基本方法:iter()、next(),使用iter()创建一个迭代器后,就可以通过next()获取迭代器的下一个值,如果通过next()不断调用并返回下一个值,那么等到最后没有下一个值了,就会抛出异常StopIteration。
其实for循环的本质就是不断调用next(),之所以不会抛出异常,是因为使用了try except,当遇到StopIteration就退出循环break

from collections import Iterable, Iterator

print('int是否为可迭代对象', isinstance(222, Iterable))
print("str是否是可迭代对象", isinstance("222", Iterable))
print("str是否是迭代器", isinstance("222", Iterator))
print("str用iter转换后是否是迭代器", isinstance(iter("222"), Iterator))

'''
int是否为可迭代对象 False
str是否是可迭代对象 True
str是否是迭代器 False
str用iter转换后是否是迭代器 True
'''

a = [1,2]
iter_a = iter(a)
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
'''
1
2
Traceback (most recent call last):
  File "test.py", line 56, in <module>
    print(next(iter_a))
StopIteration
'''
# for...in...相当于下面的函数
a = [1,2]
iter_a = iter(a)
while True:
    try:
        print(next(iter_a))
    except StopIteration:
        break
# 用迭代器实现斐波那契数列Fibonacci sequence
# F(0)=1 F(1)=1 F(n)=F(n-1)+F(n-2) (n>=2 n是正整数)
class Fib:
    def __init__(self, count):
        self.count = count # 迭代次数
        self.last = 0  # 第n-1个值,初始值为0
        self.current = 1 # 第n个值,初始值为1

    def __iter__(self):
        return self

    def __next__(self):
        if self.count > 0:
            value = self.current
            # n+1,把当前值赋给上一个值,把当前值和上一个值相加赋给下一个当前值,注意,赋值是同时进行的,不能分前后
            self.last, self.current = self.current, self.last + self.current
            self.count -= 1 # 迭代次数减一
            return value
        else:
            raise StopIteration


fib = Fib(11) # 迭代器
fib_list = [i for i in fib ]  # 迭代器生成的列表
print(fib_list)

# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

3.4.2、生成器gererator

生成器也是用在迭代操作中,是一种特殊的迭代器。
生成器还可以用于协程。
生成器具有和迭代器一样的特性,但在实现方式上不一样,可以通过两种不同的方式创建生成器,生成器表达式和生成器函数。
①生成器表达式,生成器表达式和列表推导式差不多,只需要把中括号改成小括号。
列表推导式返回的是一个列表对象,生成器表达式返回的是一个生成器对象。

a_list = [i for i in range(5)]
print(type(a_list), a_list)
a_generator = (i for i in range(5))
print(type(a_generator), a_generator)
print(next(a_generator), next(a_generator), next(a_generator))

'''
<class 'list'> [0, 1, 2, 3, 4]
<class 'generator'> <generator object <genexpr> at 0x0000028AD0ABFC10>
0 1 2
'''

②生成器函数: 普通函数一般通过return来返回一个值,生成器函数使用yield来返回
生成器函数和普通函数在执行流程上的区别:普通函数执行到return或最后一行语句时返回;生成器函数每次调用next()方法遇到yield语句才返回,如果再次调用next(),就会从上次返回的yield语句位置继续执行。

# 一个简单的生成器函数
def fun_generator(n):
    yield n

test = fun_generator(10)
print(type(test), next(test))  # 如果next溢出,同样会报错StopIteration

'''
<class 'generator'> 10
'''


# 执行next,遇到yield返回,再次执行next,从上次返回的地方开始执行
def test_generator():
    print('aaa')
    yield 1
    print('bbb')
    yield 2
    print('ccc')
    yield 3

t = test_generator()
next(t)  # aaa
next(t)  # bbb
next(t)  # ccc
next(t)  # 报错StopIteration

使用生成器实现斐波那契数列

# 使用生成器实现斐波那契数列
def fib(n):
    last, current = 0, 1
    while n > 0:
        yield current
        last, current = current, last+current
        n-=1
    
f = [i for i in fib(10)]
print(f) # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

以上是两种迭代器和生成器计算斐波那契数列的方法,还可以用递归来进行计算,但是需要注意的是,python是有递归深度的, 默认这个深度是1000, 如果超过这个深度, 会报错RecursionError, 而且就耗费时间而言,生成器 < 迭代器 << 递归计算

import time
def fib(num, last, current):
    last, current = current, last + current
    num -= 1
    if num > 0:
        return fib(num, last, current)
    else:
        return current


t1 = time.time()
m = fib(10, 0, 1)
t2 = time.time()
print(t2 - t1)
print(m) # 89

yield from 是一种简化语法的语法糖
语法糖:计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员调用。通常语法糖能够增加程序的可读性,从而减少代码出错的机会。

# yield from iterator 等价于
for item in iterator:
    yield item
def test():
    for i in range(1000):
        yield i

# 使用yield from简化
def test_1():
    yield from range(1000) # 从迭代对象range(1000)一个个取值

t = test_1()
print(next(t)) # 0
print(next(t)) # 1

3.4.3、生成器gererator的方法:send()、close()

send 方法包含了next方法,向生成器发送一个值之后就恢复运行,返回值就是yield的值

# 下面这个从0递增的迭代器,如果send值为None,递增不变,如果send有值,就从send的数值开始递增
def test():
    n = 0
    while n < 10:
        n += 1
        send = yield n
        if send is not None:
            n = send

t = test()
print(next(t))    # 1
print(next(t))    # 2
print(t.send(5))  # 6
print(next(t))    # 7
print(next(t))    # 8

close,终止迭代器,正常来说,next在遇到StopIteration异常就会停止迭代,而close执行之后会在函数暂停的地方抛出GeneratorExit异常,从而迭代器抛出StopIteration异常。

def test():
    num = 0
    while num < 10:
        num += 1
        yield num
 
g = test()
print(next(g)) # 1
g.close() # 关闭迭代器
print(next(g))  # 迭代器已经关闭,再使用next会抛出StopIteration异常

throw:再生成器暂停的地方抛出一个异常,并且返回下一个yield的返回值

def test():
    num = 0
    while num < 10:
        try:
            num += 1
            yield num
        except ZeroDivisionError:
            print("ZeroDivisionError")
 
g = test()
print(next(g))
print(g.throw(ZeroDivisionError))  # 抛出异常,返回下一个yield的值
print(next(g))

'''
1
ZeroDivisionError
2
3
'''

总结:
1、生成器是迭代器的一种
2、包含yield的函数都是一种生成器(每次执行到yield会停一下,保存当前信息并返回迭代值),(i for i in range(1,11) ),也是一种生成器
3、生成器记录的是算法,在for循环或者next里才会计算具体的值,所以相对列表而言会更节省空间


四、数据序列

4.1、字符串

1、字符串特征
字符串用单引号、双引号或三引号修饰 a = 'tom',三引号支持回车换行

2、下标(索引)
下标的作用就是快速找到对应的数据

str = "abcdd"
str[2]

3、切片
截取一部分内容。字符串、列表、元组都支持切片操作

序列[开始位置下标:结束位置下标:步长]

注意:
①不包含结束位置下标对应的数据,正负整数均可,-1代表倒数第一个数据,依次类推。
②步长是选取间隔,正负整数均可,默认步长为1,复数代表倒序选取
③开始、结束、步长都可以不写

4、常用操作方法
①查找
str.find(子串,开始位置下标,结束位置下标) 返回的是字串第一次出现的下标,返回-1代表子串不存在
str.index(子串,15,20),返回的也是下标
str.count(子串,15,30),返回的是下标15到30子串的数量,不存在返回0
在这里插入图片描述
②修改
str.replace(旧子串,新子串,替换次数) 字符串替换,替换之后返回新的字符串,本来的字符串是不变的,说明字符串是不可变数据类型
str.split(分割字符,num) ,num为分割字符出现的次数
连接字符.join(多字符串组成的序列) 将多个字符串合并成1个字符串

mylist = ["aa","bb","cc"]
new_str = ",".join(mylist)  #用逗号连接

③大小写转换
将字符串第一个字符转换成大写:str.capitalize()
将字符串每个单词的首字母转换成大写:str.title()
将字符串中大写转小写:str.lower()
将字符串中小写转大写:str.upper()

④删除操作
删除字符串左侧空白字符:str.lstrip()
删除字符串右侧空白:str.rstrip()
删除字符串两侧空白:str.strip()

⑤字符串左右对齐修改
字符串左对齐,不足用指定字符填充(默认空格)str.ljust(长度,填充字符)
字符串右对齐,不足用指定字符填充(默认空格)str.rjust(长度,填充字符)
字符串居中,不足用指定字符填充(默认空格)str.center(长度,填充字符)

⑥判断相关,返回true和false
1是否以某个字符串开头,str.startswith(子串,开始位置下标,结束位置下标)
2是否以某个字符串结尾,str.endswith(子串,开始位置下标,结束位置下标)
3字符串至少有一个字符,并且所有字符都是字母,str.isalpha()
4字符串值包含数字,str.isdigit()
5字符串至少有一个字符并且所有字符都是字母或数字,str.isalnum()
6字符串中只包含空白:str.isspace()


4.2、列表list

1、列表的格式
列表可以一次性存储多个数据,且可以为不同的数据类型,但是尽量放相同的数据类型

mylist = [数据1,数据2,数据3.......]

2、列表的常用操作

①查找
·下标 mylist[num]
·函数
1返回指定数据所在位置的下标,mylist.index(数据,开始位置下标,结束位置下标)
2指定数据在当前列表中出现的次数,mylist.count(查找的数据)
3返回列表长度,len(mylist),len()是公用方法

②判断是否存在,返回boolean
1判断指定数据在某个列表序列,指定数据 in mylist
2判断指定数据不在某个列表序列,指定数据 not in mylist

③增加数据
1列表结尾追加数据,如果数据是一个序列,则追加的是整个序列,mylist.append(数据)
2列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表,mylist.extend(数据)
3指定位置新增数据,mylist.insert(位置下标,数据)

④删除
1del删除,删除列表,del mylist;删除指定数据,del mylist[下标]
2删除指定下标的数据(默认为最后一个),并返回该数据,mylist.pop(下标)
3移除列表中某个数据的第一个匹配项,mylist.remove(数据)
4清空列表,mylist.clear()

⑤修改
1修改指定下标数据,mylist[下标] = “数据”
2逆置,mylist.reve

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值