Python笔记

目录

Python开发环境配置与程序执行

1、Python运行环境

2、PyCharm开发环境

一、注释

二、变量

1、变量名:访问变量值

2、赋值符号:把变量值的内存地址绑定给变量名

3、变量值:存储的数据

4、内存管理机制

三、用户交互

1、接收输入:

2、格式化输出:

四、基本运算符

1、算数运算符:+、-、*、/、//、%

2、比较运算符:>、>=、<、<=、==、!=

3、赋值运算符:=

4、逻辑运算符:not、and、or

5、成员运算符:in

6、身份运算符:is

五、流程控制

1、if判断

2、while循环

3、for循环

六、异常处理 

七、字符串

1、定义

2、类型转换

3、内置方法

八、列表

1、定义

2、类型转换

3、内置方法

九、元组

1、定义

2、类型转换

3、内置方法 

十、字典

1、定义

2、类型转换

3、内置方法

十一、集合

1、定义

2、类型转换

3、内置方法 


Python开发环境配置与程序执行

1、Python运行环境

Python解释器可以运行 Python程序(和Python代码)

官网:https://www.python.org/

2、PyCharm开发环境

PyCharm 是IDE(集成开发环境),专业用来开发、调试、测试 python代码的

官网:https://www.jetbrains.com/zh-cn/pycharm/download/#section=windows

配置:

(1)安装中文插件(可选)

(2)设置终端模式(Windows 必选)

                venv 使用 cmd

                PS 使用 powershell (很强,但是很不好用,适合专用PS的高手)

                Windows 默认安全策略,禁止执行PS

                设置步骤:文件、设置、搜索”终端“,shell路径、选择cmd

(4)字符编码:不含BOM头的UTF-8

(5)文件模板:文件、设置、搜索”模板“、选择python模板,修改模板内容

(5)项目和虚拟环境

                我明明安装了第三方库,为什么执行报错,提示没有这些库?我现在用的pip 是哪一个?我现在用的python是哪一个?

                在cmd下,如果激活虚拟环境,前缀会自动加上venv

                在cmd下,前缀没有venv,大概率,没有激活虚拟环境

                虚拟环境是项目提供专用的python解释器和python运行环境

(6)调试代码

                选择断点:程序在执行到此时,会暂停,以便调试

                右键调试代码:观察代码内部执行细节、让程序暂停执行任意调试代码、也是排查错误的重要手段

一、注释

  • """多行注释加在整个py文件的开头,用于对该文件进行一个整体的说明"""
  • # 注解说明,或是注掉暂时不想执行的代码

二、变量

1、变量名:访问变量值

  • 大前提:见名之意
  • 命名规范:字母数字下划线组成,数字不能开头,不能与python关键字重名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
  • 命名风格:纯小写加下划线、驼峰体

2、赋值符号:把变量值的内存地址绑定给变量名

3、变量值:存储的数据

id是变量值的身份证号反映内存地址
x = 257
y = x                 # 把变量名x绑定的内存地址再绑定给y,所以id(y)等于id(x)
x = 257
y = 257             # 实际在内存中重新开辟一块空间存放257,所以id(y)不等于id(x) 

type类型:

  • 整形int:
  • 浮点型float:
  • 字符串str:
  • 列表list:在[]内用逗号分隔开多个任意类型的元素
  • 元组tuple:在()内用逗号分隔开多个任意类型的元素
  • 字典dict:在{}中按照key:value的格式存放多个元素,其中key是不可变类型,而value可以是任意类型
  • 集合set:在{}内用逗号分隔开多个元素(不可变,无序,唯一)
  • 布尔bool:Ture、False

可变不可变类型:

  • 可变类型(list、dict):id不变,值可以改变
  • 不可变类型(int、float、str、tuple):id不变,值固定不可变

4、内存管理机制

引用计数:

  • 当有新的引用指向时,引用计数+1。
  • 当该对象的引用计数失效时,引用计数 -1。
  • 一旦对象的引用计数为0,该对象立即被回收,空间将被释放。

标记清除(引用计数无法解决循环引用):

  • 标记清除是一种基于追踪回收的算法,分两个阶段。
  • 第一阶段,从根对象出发沿着有向遍历对象,可达的对象标记为“活动对象”,不可达的对象标记为”非活动对象“。
  • 第二阶段,回收那些“非活动对象”。

分代回收(维护引用计数会消耗资源):

  • python根据对象的存活时间将内存分为不同的集合,每个集合称为一代,python将内存分为了3代。分别为 年轻代(第0代)、中年代(第1代)、老年代(第2代)。
  • 这三代分别对应的是三个链表。
  • 新创建的对象会被分配在年轻代。年轻代链表总数达到上限的时候,python的垃圾回收机制就会触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去。以此类推,老年代中的对象是存活时间最久的对象。
  • 分代回收建立在标记清除的技术基础上。

三、用户交互

1、接收输入:

name=input("请输入你的名字:")  
age=input("请输入你的年龄:")        # 将用户输入的所有内容都存成字符串

age=int(age)                       # 将纯数字的字符串转换成整型

2、格式化输出:

2.1、%s

# 根据位置传值,一一对应
res="my name is %s my age is %s" %("cangyuan",18)

# 根据字典的形式传值
res="my name is %(name)s my age is %(age)s" %{"age":18,"name":"cangyuan"}

# 可以接受任意类型
print("my age is %s" %18)
print("my age is %s" %[1,2,3])
print("my age is %s" %{"age":18})

2.2、str.format()

# 根据位置传值,一一对应
res="my name is {} my age is {}".format("cangyuan",18)
res="my name is {0}{0}{0} my age is {1}{1}{1}".format("cangyuan",18)

# 根据key=value传值
res="my name is {name} my age is {age}".format(age=18,name="cangyuan")

print("how","are","you")
print("hello world",end="")

2.3、f

x=input("your name: ")
y=input("your age: ")
res=f"my name is {x} my age is {y}"
print(res)

四、基本运算符

1、算数运算符:+、-、*、/、//、%

2、比较运算符:>、>=、<、<=、==、!=

3、赋值运算符:=

X+=1        #增量赋值

y=x=1       #链式赋值

x=1
y=2
x,y=y,x     #交叉赋值

x,y,z,*_=[111,222,333,444,555]
*_,x,y,z=[111,222,333,444,555]    #解压赋值

4、逻辑运算符:not、and、or

  • not:逻辑非,使紧随其后的条件取反
  • and:逻辑与,连接左右两个条件,只有左右两个条件都为真时结果才为真
  • or:逻辑或,连接左右两个条件,两个条件中有一个为真时结果为真

ps运算的优先级:not > and > or

ps短路运算(了解):偷懒运算到哪个位置,就把当前位置的值返回

5、成员运算符:in

print("aa" in "hello")        #判断一个字符串是否在一个字符串中
print(22 in [1,22,33,"aa"])   #判断一个元素是否在一个列表中
print("age" in {"age":18})    #判断一个key是否在一个字典中

6、身份运算符:is

x=10
y=12
print(id(x) is id(y))         #比较两个值的id是否相等

五、流程控制

1、if判断

"""
if 条件1:
    代码1
    代码2
    代码3
elif 条件2:
    代码1
    代码2
    代码3
elif 条件3:
    代码1
    代码2
    代码3
...
else:
    代码1
    代码2
    代码3
"""

ps条件:

        显示布尔值:True、False

        隐式布尔值:所有数据类型,其中0、""、[]、{}、None为假

2、while循环

'''
while 条件:
    代码1
    代码2
    代码3
else:
    代码
'''

 break:终止循环,且之后的else不会执行

continue:结束本次循环

3、for循环

'''
for 变量名 in 可迭代对象:        # 字符串、列表、字典、元组、集合
    代码块
else:
    代码块
'''

 range()

六、异常处理 

# 1、什么是异常
# 程序运行过程中一旦出错就会抛出异常,程序的运行随即终止
# 异常的三个特征(异常的追踪信息、异常的类型、异常的内容)

# 2、为何要处理异常
# 为了增强程序的健壮性
# 即便是程序运行过程中出错了,也不要终止程序
# 而是捕捉异常并处理,将出错信息记录到日志内

# 3、如何处理异常
# 语法上的错误SyntaxError:必须在程序运行前就改正
# 逻辑上的错误
#     错误发生的条件是可以预知的:if
#     错误发生的条件是无法预知的:try
...
print("start=================>>")
try:
    子代码块1
    子代码块2
    子代码块3
except (IndexError,NameError) as e:
    pirnt("异常信息:",e)
except KeyError as e:
    pirnt("异常信息:",e)
except Exception as e:
    print("所有的异常都可以捕捉到")
print("end====================>>")
...

...
print("start=================>>")
try:
    子代码块1
    子代码块2
    子代码块3
except Exception as e:
    print("所有的异常都可以捕捉到")
else:
    print("没有捕捉到异常时执行")
print("end====================>>")
...

...
print("start=================>>")
try:
    子代码块1
    子代码块2
    子代码块3
except Exception as e:
    print("所有的异常都可以捕捉到")
else:
    print("没有异常时执行")
finally:
    print("无论有没有异常都会执行,通常写回收系统资源的代码")
print("end====================>>")
...

七、字符串

1、定义

mes="hello"

2、类型转换

# 任意类型都可以转换成字符串
print(str(1))
print(str(1.2))
print(str([1,2,"cc"]))
print(str((1,2,"cc")))
print(str({"name":"cang","age":18}))

3、内置方法

# 按索引取值(正向取,反向取,只能取不能改)
mes="hello word"
print(mes[0])
print(mes[-1])

# 切片(顾头不顾尾,步长)
mes="hello word"
print(mes[0:5])
print(mes[0:5:2])
print(mes[::-1])

# 长度len
mes="hello word"
print(len(mes))

# 成员运算in,not in
mes="hello word"
print("he" in mes)
print("he" not in mes)

# 循环
mes="how:are:you"
for x in mes:
    print("---->")
mes="**hello world****"
print(mes.strip("*"))           
print(mes.lstrip("*"))
print(mes.rstrip("*"))

mes="hello world"
print(mes.center(20))
print(mes.center(20,"*"))
print(mes.ljust(20,"*"))
print(mes.rjust(20,"*"))

mes="how:are:you"
print(mes.split(":",1))
print(mes.rsplit(":",1))

list1=["how","are","you"]
print(" ".join(list1))

mes="Hello World"
print(mes.lower())
print(mes.upper())
print(mes.startswith("He"))
print(mes.endswith("ld"))

mes="how are you"
print(mes.replace("o","O",2))

mes="123"
print(mes.isdigit())
# find,rfind,index,rindex,count
mes="hello world"
print(mes.find("l"))
print(mes.find("$$$$$"))
print(mes.rfind("l"))        
print(mes.index("l"))
print(mes.rindex("l"))
print(mes.count("l"))

# expendtabs
mes="hello\tworld"
print(mes.expandtabs(2))

# captalize,swapcase,title
mes="hello world"
print(mes.capitalize())
print(mes.swapcase())
print(mes.title())

# is数字系列
num1=b"4"    # bytes
num2="4"     # unicode
num3="四"    # 中文数字
num4="Ⅳ"    # 罗马数字
print(num1.isdigit())       # True
print(num2.isdigit())       # True
print(num3.isdigit())       # False
print(num4.isdigit())       # false
print(num2.isdecimal())     # True
print(num3.isdecimal())     # false
print(num4.isdecimal())     # false
print(num2.isnumeric())     # True
print(num3.isnumeric())     # True
print(num4.isnumeric())     # True

# is其它系列
print("abc".islower())
print("ABC".isupper())
print("ABC".isalpha())
print("ABC221".isalnum())
print("Hello World".istitle())
print("   ".isspace())
print("age_of_earth".isidentifier())

八、列表

1、定义

# 在[]内用逗号分隔开多个任意类型的元素
l=[1,1.2,"aa"]

2、类型转换

# 可迭代对象都可以转换成列表
print(list("aaa"))                        # ["a","a","a"]
print(list((1,2,"cc")))                   # [1,2,"cc"]
print(list({"name":"cang","age":18}))     # ["name","age"]

3、内置方法

# 按索引取值(正向取,反向取,可以取也可以改)
mes=[1,2.2,"hello"]
print(mes[0])
print(mes[-1])
mes[0]=10
print(mes)

# 切片
mes=[1,2.2,"hello"]
print(mes[0:3:1])
print(mes[:])           # 相当于浅拷贝
print(mes[::-1])

# 长度
mes=[1,2.2,"hello"]
print(len(mes))

# 成员运算in,not in
print("hello" in [1,2.2,"hello"])
print("aaa" not in [1,2.2,"hello"])

# 循环
mes=[1,2.2,"hello"]
for x in mes:
    print(x,type(x))

# 增
mes=[1,2.2,"hello"]
mes.append(333)
print(mes)
mes.insert(1,"aaa")
print(mes)
l=[1,2,3]
# for x in l:
#     mes.append(x)
mes.extend(l)
print(mes)

# 删
mes=[1,2.2,"hello"]
del mes[1]
print(mes)
mes=[1,2.2,"hello"]
mes.pop()       # 有返回值,即删除的那个值
print(mes)
mes=[1,2.2,"hello"]
mes.pop(1)
print(mes)
mes=[1,2.2,"hello"]
mes.remove(1)
print(mes)

# 反转、清空、排序
mes=[1,2.2,"hello"]
mes.reverse()
print(mes)
mes.clear()
print(mes)
mes=[1,2.2,-9,30]
mes.sort()
print(mes)
mes=[1,2.2,-9,30]
mes.sort(reverse=True)
print(mes)

# 计数、找到元素所在的索引
mes=[1,2.2,"hello"]
print(mes.count(2.2))
print(mes.index("hello"))    # 找不到则抛出异常
list1=[1,"hello",[111,222]]
list2=list1                    #这不叫拷贝,id(list2)等于id(list1)

list1=[1,"hello",[111,222]]
list2=list1.copy()             
# 浅拷贝,不区分可变不可变类型,直接把地址拿过来
# id(list2)不等于id(list1)
# id(list2[0])等于id(list1[0])
# id(list2[1])等于id(list1[1])
# id(list2[2])等于id(list1[2])

import copy
list1=[1,"hello",[111,222]]
list2=copy.deepcopy(list1)
# 深拷贝,不可变类型直接把地址拿过来,可变类型换个地址
# id(list2)不等于id(list1)
# id(list2[0])等于id(list1[0])
# id(list2[1])等于id(list1[1])
# id(list2[2])不等于id(list1[2])

九、元组

1、定义

# 在()内用逗号分隔开多个任意类型的元素
t=(1,1.3,"aa")        # t=tuple((1,1.3,"aa"))
print(t,type(t))

t=(10,)               # 如果元组中只有一个元素,必须加逗号
print(t,type(t))

t=(10)                # t是整形

2、类型转换

# 可迭代对象都可以转换成元组
print(tuple("aaa"))                        # ("a","a","a")
print(tuple([1,2,"cc"]))                   # (1,2,"cc")
print(tuple({"name":"cang","age":18}))     # ("name","age")

3、内置方法 

# 按索引取值(正向取,反向取,只能取不能改)
t=(1,2.2,"aa")
print(t[0])
print(t[-1])

# 切片
t=(1,2.2,"aa")
print(t[0:2])
print(t[::-1])

# 长度
t=(1,2.2,"aa")
print(len(t))

# 成员运算in,not in
t=(1,2.2,"aa")
print(2.2 in t)
print(2.2 not in t)

# 循环
t=(1,2.2,"aa")
for x in t:
    print(x)

# index,count
t=(1,2.2,"aa")
print(t.index(2.2))
print(t.count(2.2))

十、字典

1、定义

# 在{}中按照key:value的格式存放多个值,key是不可变类型,value可以是任意类型
d={"k1":111,"k2":222}
d={}                        # 定义一个空字典
d=dict(k1=111,k2=222)

2、类型转换

info=[
    ["name","cang"],
    ["age",18],
    ["sex","male"]
]

d={}
for k,v in info:
    d[k]=v
print(d)

d=dict(info)
print(d)
key=["name","age","sex"]

d={}
for k in key:
    d[k]=None
print(d)

d={}.fromkeys(key,None)
print(d)

3、内置方法

# 按key取值
d={"k1":111}
d["k1"]=11111     # key存在,则修改
d["k2"]=222       # key不存在,则创建新值

# 长度
d={"k1":333,"k2":222,"k1":222,"k1":111}
print(d,len(d))         # {"k1":111,"k2":222} 2所以key是不可变类型,且唯一

# 成员运算in,not in
d={"k1":333,"k2":222}
print("k1" in d)
print("k3" not in d)

# 键key()、值value()、键值对items()
d={"name":"cang","age":18,"sex":"male"}
print(d.keys())
print(d.values())
print(d.items())

# 循环
d={"name":"cang","age":18,"sex":"male"}
for k in d:
    print(k)
for v in d.values():
    print(v)
for k,v in d.items():
    print(k,v)
d={"name":"cang","age":18,"sex":"male"}
d_new={"name":"yuan","height":888}
# 增
d["k2"]=222                # key不存在,则创建新值;key存在,则修改
d.setdefault("k2",222)     # key不存在,则创建新值;key存在,则do nothing
d.update(d_new)

# 删
del d["name"]
d.pop("age")               # 删除key所对应的value,返回value
d.popitem()                # 随机删
d.clear()

# 查
print(d["age"])
print(d.get("age"))        # 返回key所对应的value,没有返回None

十一、集合

1、定义

# 在{}内用逗号分隔开多个元素(不可变,无序,唯一)
s={1,2.2,"cang",(1,2,3)}
s=set()         # 空集合,注意单独的一个{}代表空集合

2、类型转换

# 可迭代对象可以转换成集合(对象中的元素必须是不可变类型)
s=set("adfhufj")
s=set([1,2,3])
s=set((1,2,3))
s=set({"name":"cang","age":13})
s=set({1,2.2,"cang",(1,2,3)})

3、内置方法 

s1={1,2,3}
s2={1,2,4}
# 交集&
print(s1 & s2)
print(s1.intersection(s2))
# 并集|
print(s1 | s2)
print(s1.union(s2))
# 差集-
print(s1 - s2)
print(s1.difference(s2))
print(s2 - s1)
print(s2.difference(s1))
# 对差^
print(s1 ^ s2)
print(s1.symmetric_difference(s2))
# 父子集> < ==
print(s1 > s2)
print(s1.issuperset(s2))
print(s1 < s2)
print(s1.issubset(s2))
print(s1 == s2)

# 增
s1.update(s2)       # 等同于s1 = s1 | s2
s1.add(5)

# 删
s1.pop()
s1.remove(3)        # 删除元素,不存在则报错
s1.discard(5)       # 删除元素,不存在则返回None
s1.clear()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值