加载中...

Python 基础

Python解释器 & pycharm安装

注释 #

变量

常量

input
#输入框

if
#条件判断

while
#循环

关键字 continue break 
关键字 pass

for循环

for 变量 in 可迭代的东西:
    代码

把可迭代的东西中的每一项内容拿出来,挨个的赋值给变量,每一次赋值都要执行一次循环体(代码)

for循环想要计数,需要借助range
range(n):从0数到n,不包含n
range(m,n):从m数到n,不包含n
range(m,n,s):从m数到n,不包含n,每次的间隔步长是s

数据类型

type()
#查看数据类型

float 
int 
bool

字符串

字符串格式化

1. 字符串格式化问题
# %s 字符串占位符
# %d 整数占位符
# %f 小数占位符
s = "%s,%d,%f" % {num1,num2,num3}
s2 = "{},{}".format(num1,num2)
s3 = f"{},{}" #f-string

字符串切片

s = "hello world"

s[3]
s[-1]

s[start,end]
s[0:5]
s[:5]
s[6:]
s[-3:-1]

s[start:end:step]
s[::-1] # 可以给切片添加步长来控制切片的方向,-1表示倒序
s[-1:-10:-3]

字符串常规操作

字符串的操作一般不会对原字符串产生影响,一般是返回一个新的字符串

# 1. 字符串首字母大写
s = "hello world"
ss = s.capitalize()

# 2. 每个单词的首字母大写
ss = s.title()

# 3. 全部变成小写字母
ss = s.lower()

# 4. 全部变成大写字母
ss = s.upper()
print(ss)

# 5. 忽略大小写验证码
verify_code = "aD1v"
user_code = input(f"请输入验证码({verify_code}:)")
print(user_code)

if verify_code.upper() == user_code.upper() :
    print(verify_code.upper(),user_code.upper())
    print("true,go go go")
else:
    print("test")

字符串切割和替换

# 切割和替换

# strip()   去掉字符串两边的空白符(空格、\t、\n)
s = "   hello  world    "
s1 = s.strip()
print(s1)

# 案例
username = "admin"
password = "psd"
user = input("username:").strip()
psd = input("password:").strip()
if user == username and psd == password:
    print("登陆成功")
else:
    print("登录失败")

# replace(old,new)  字符串替换

s = "hi man"
ss = s.replace("man","boy")
print(ss)

# split 字符串切割,用谁切就会损失掉睡
s = "java_aaa_home_world"
ss = s.split("_")   #切割后的结果放到列表中
print(ss)

查找和判断

# 查找和判断

# find()    返回值是找到元素的下标,-1代表未找到
s = "hello world"
print(s.find("llo"))
print(s.find("wod"))

# index()   返回元素下标,如果报错表示未找到
# print(s.index("hell"))
# print(s.index("aa"))

# in   判断是存在,返回true 或 false
# not in    判断是否不存在
print("hello" in s)
print("hh" not in s)

# startswith("str")  判断字符串是否以str开头
# endswith("str")    判断字符串是否以str结尾
if s.startswith("hello"):
    print("true")
else:
    print("false")

# isdigit() 判断是否是整数
money = input("请输入您的余额")
if money.isdigit():
    # money = int(money())
    print(type(money))

列表

s = "hello world"
# len()		长度  
# join()	

# 列表
# []来表示一个列表,中间元素用 , 分隔开

a = [123,"test","hello world",["hh,hh","jj"]]
print(a[3][1])

# 特性:
#       1. 可以像字符串一样也有索引和切片
#       2. 索引超过范围会报错
#       3. 可以用for in 遍历


# 列表的增删改查
lst = []

# 增
# append()  追加
lst.append("中华田园犬")
lst.append("二哈")
# insert()  插入
lst.insert(1,"柴犬")
# extend()  合并两个列表,批量的添加
lst.extend(["萨摩耶","泰迪"])
print(lst)

# 删
# pop() 给出被删除的索引,返回被删除的元素
ret = lst.pop(2)
print(lst)
print(ret)
# remove()  给出删除的元素,无返回值
lst.remove("泰迪")
print(lst)

# 改 直接用索引更改
lst[2] = "秋田犬"
print(lst)

# 查 直接用索引进行查询操作
print(lst[0])


# 练习
# 把所有姓张的改成姓王的

lst2 = ["张无忌","张三丰","弘一法师"]
for i in lst2:
    if i.startswith("张"):
        new_name = "王" + i[1:]
        lst2[lst2.index(i)] = new_name

print(lst2)

# ——————————————————————————————————————————————————————————

# 列表的其他操作

# sort()    升序, reverse=True 倒序

lst = [1,5,2,4,6]
lst.sort()
print(lst)
lst.sort(reverse=True)
print(lst)

# 列表的循环删除
lst = ["张三丰","张无忌","灭绝"]
temp = []
for item in lst:
    if item.startswith("张"):
        temp.append(item)
print(lst)
for item in temp:
    lst.remove(item)
print(lst)
print(temp)

元组

# tuple 元组,特点:不可变的列表
t = (1, 2, 3, 4, 5)

print(t)
print(t[2])

# * 元组如果只有一个元素,需要在元素的末尾添加一个逗号

集合

# set集合,set集合是无序的

# 不可哈希:python中的set集合进行数据存储的时候,需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据
#         set集合要求存储的数据必须是可进行哈希计算的。
#         可变的数据类型:list,dict,set
# 可哈希:不可变的数据类型,int,str,tuple,bool

s = {1, 2, 3}

# * 作用:可以去重复

lst = [1,2,3,4,5,2,4,5,6,2,4,5,5,5,5]
print(lst)
print(lst(set(lst)))

字典

# 字典是以键值对的形式进行存储数据的
# 字典的表示方式:{key:value,key2:value,key3:value}

dic = {"jay": "周杰伦", "金毛狮王": "谢逊"}
val = dic["jay"]
print(val)

# 字典的key必须是可哈希的数据类型
# 字典的value可以放任何数值

# 字典的增删改查
# 增
dic = dict()
dic['jay'] = "周杰伦"
dic["tom"] = "jerry"
print(dic)

# 删
dic.pop("jay")
print(dic)

# 查
print(dic["tom"])      # 如果key不存在,程序报错
print(dic.get("tom"))   # 如果key不存在,程序返回none

dic = {
    "伍六七": "玄武国第一刺客",
    "大飞": "小飞的爸爸",
    "小飞": "大飞的儿子",
    "鸡大保": "大飞鸡友"
}

# 1. 使用for循环遍历字典
for key in dic:
    print(key, dic[key])

# 2. 把所有的key全部保存到一个列表中
# keys()
print(list(dic.keys()))

# 3. values()   拿到所有的value

# 4. items()    直接拿到字典中的key和value

a, b = (1, 2)   # 元组或者列表都可以执行该操作,该操作被称为结构结构(解包)
print(a)
print(b)
# 字典的遍历
dic = {
    "伍六七": "玄武国第一刺客",
    "大飞": "小飞的爸爸",
    "小飞": "大飞的儿子",
    "鸡大保": "大飞鸡友"
}
temp = []
for key in dic:
    if key.startswith("大"):
        temp.append(key)

for t in temp:
    dic.pop(t)

print(dic,temp)

字符集和编码

"""
    1. 字符集和编码
    0 1  =>  101010100  =>  二进制转化成十进制  <==>
    ascii => 编排了128个文件符号,只需要7个0和1就可以表示了

    2. bytes
        str.encode("编码")    进行编码
        bytes.decode("解码")  进行解码

"""

# encode()
s = "周杰伦"
bs1 = s.encode("gbk")   # b'xxxx' bytes类型
bs2 = s.encode("utf-8")
print(bs1)
print(bs2)

# decode()
bs = b'\xd6\xdc\xbd\xdc\xc2\xd7'
s = bs.decode("gbk")    # 解码
print(s)

运算符

"""
1. 算术运算
    + - * / % //
2. 比较运算
    > < >= <= == !=
3. 赋值运算
    =   +=  -=  *= ...
4. 逻辑运算
    and or  not
    括号 > 算not > and > or
5. 成员运算
    in
    not in
"""

文件操作

"""
文件操作
1. open(文件路径, mode="", encoding="")
    文件路径: 绝对 相对
    mode:    
    	r : read 读取
    	w : write 写
    	a : append 追加写入
    	rb : 查看图片
    	wb : 写图片
    width:上下文,不需要手动关闭一个文件	
    
    修改文件:
    	1. 从源文件中读取内容
    	2. 从内存中进行调整(修改)
    	3. 把修改后的内容写入新文件中
    	4. 删除源文件,将新文件重命名成源文件
    
    .read()  全部读取
    .readline() 读取一行  
    .readlines() 以列表的形式打印出来

	

"""

f = open("test.txt", mode="r", encoding="utf-8")
for line in f:
    print(line.strip())
    
# 自动关闭文件     
with open("test.txt", mode="r", encoding="utf-8") as f:
	for i in f:
		print(i.strip())  
    

# 姓周的改成姓张的
import os
import time

with open("test.txt", mode="r", encoding="utf-8") as f,open("test2.txt", mode="w", encoding="utf-8") as f2:
    for line in f:
        line.strip()
        if line.startswith("周"):
            line = line.replace("周", "张")
        f2.write(line)

time.sleep(3)
os.remove("test.txt")
time.sleep(3)
os.rename("test2.txt","test.txt")

函数

# 函数声明
def 函数名():
    函数体
    
# 调用
函数名()

"""
参数:可以在函数调用的时候,给函数传递一些信息

分类:
	1. 形参,在函数定义的时候,需要准备一些变量来接收消息
		1. 位置参数,按照位置一个一个的去声明变量
		2. 默认值参数,在函数声明的时候给变量一个默认值,如果实参不传递信息,此时默认值生效,否者就不生效
		3. 动态传参
			1. *args,表示接收所有的位置参数的动态传参,接收到的所有参数被处理成元组
			2. **kwargs, 表示接收关键字的动态传参,接收到的所有参数会被处理成字典
		顺序:位置 > *args > 默认值 > **kwargs 
			
			
	2. 实参,实际在调用的时候传递的信息
		1. 位置传参,按照位置顺序进行传递参数
		2. 关键字传参,按照参数的名字进行传递参数
			function(name1 = "test2",name2 = "test1")
		3. 混合传参,位置参数放前,关键字参数放后面
			function("test1","test2",name3="test3")
		实参在执行的时候,必须要保持形参有数据
 	
 	*在实参位置,是把列表打散成位置参数进行传参
 	**在实参位置,可以吧字典自动转化成关键字参数进行传递
"""


"""
    返回值:函数执行之后,会给调用方一个结果,这个结果就是返回值
    关于return:
    	函数只要执行到了return,函数就会立即停止并返回内容,函数内的return的后续的代码不会执行
    	1. 如果函数内没有return,此时外界收到的是None
    	2. 如果写了return
    		1. 只写了return,后面不跟数据,接收值是None
    		2. return 值,此时表示函数有一个返回值,外界能够收到一个数据
"""

内置函数

作用域

作用域:变量的访问权限

全局变量 	全局作用域
局部变量	局部作用域

函数的嵌套

函数可以嵌套函数

综上:
	1. 函数可以作为返回值进行返回
    2. 函数可以作为参数进行互相传递
函数实际上就是一个变量名,都是表示一个内存地址

15. global 和 nonlocal

 """
global : 在局部引入全局变量

nonlocal : 向外找一层 ,看看有没有该变量,如果有就引入,如果没有 继续向外一层,不包括全局变量

"""

a = 10
def func():
    # 把外面的全局变量引入到局部
    global a
    a = 20
func()
print(a)

def func1():
    a = 10
    def func2():
        nonlocal a
        a = 20
    func2()
    print(a)
func1()

闭包

"""
闭包:本质,内层函数对外层函数的局部变量的使用,此时内层函数被称为闭包函数
	1. 可以让一个变量常驻于内存
	2. 可以避免全局变量被修改
"""

def func():
    a = 10
    def inner():
        nonlocal a
        a += 1
        return a
    return inner

ret = func()
a = 20
r1 = ret()
print(r1)
r2 = ret()
print(r2)

装饰器

"""
内容回顾:
	1. 函数可以作为参数进行传递
	2. 函数可以作为返回值进行返回
	3. 函数名称可以变成变量一样进行复制操作
	
装饰器:
	 装饰器本质上是一个闭包
	 作用:
	 	在不改名原有函数调用的情况下,给函数增加新的功能
	 	直白:可以在函数前后添加新功能,但是不改变源代码
	 	
	 在用户登录的地方,日志
	 雏形:
	 	def 
"""

def guanjia(game):
    def inner():
        print("start")
        game()
        print("end")
    return inner

def play():
    print("play game")

@guanjia
def playFootball():
    print("play football")

play = guanjia(play)

play()
playFootball()

edit

posted @ 2023-05-19 13:27  sroot  阅读(4)  评论(0编辑  收藏  举报