文章目录

  • IPO编程方式、print、input函数
      • print() -- 输出信息到屏幕
      • input() -- 读取用户的输入
  • 基本数据类型
    • int、float、bool、str
      • 常用 str 操作方法
      • 格式化字符串的三种方式
      • 数据验证方法
      • 字符串拼接
      • 字符串去重
    • 数据类型转换函数
  • 容器类型
    • 列表(list):可变、可重复、有序
    • 元组(tuple): 不可变、可重复、有序
      • 元组元素的访问与遍历
    • 集合(set):可变、不重复、无序
      • 集合的创建
      • 集合元素的操作方法
    • 字典(dict):键值对,类似 Java 中的 Map
      • 字典类型创建方式
      • 字典元素的访问和遍历
      • 字典相关操作方法
      • 字典类型生成式
    • 列表、元组、字典、集合的区别
  • 正则表达式
    • 元字符
    • 限定符
    • 其他字符
    • re模块
      • match函数的使用
  • 函数的定义和调用
    • 变量的作用域
    • 匿名函数lambda
  • 类与对象
    • 类的组成
    • 创建多个类的实例对象
    • 动态绑定属性和方法
    • 封装、继承、多态
      • 封装
        • 访问私有属性和方法
        • dir() 函数。
      • 继承
      • 多态
  • Object 类
    • 对象的特殊方法
    • 特殊属性
  • 模块
    • 常用内置模块
      • random 模块
      • time 模块
      • datetime 模块
      • os 模块
    • 常用第三方模块
      • 第三方模块的安装与卸载
      • requests
        • 爬取景区的天气预报
        • 爬取百度LOGO图片
      • openpyxl
        • 将爬取到景区的天气预报数据保存在Excel中

IPO编程方式、print、input函数

在这里插入图片描述

print() – 输出信息到屏幕

print('Hello World')name = "Lei"
age = 20
print("名字:", name, "年龄:", age)

在这里插入图片描述
常用参数

参数名说明
sep指定多个参数之间的分隔符,默认是空格 " "
end输出结束后的字符,默认是换行符 "\n"
file输出目标,默认是终端,可以写入文件
flush是否立刻输出缓存,默认是 False
print("apple", "banana", "cherry", sep=", ")  # 输出用逗号分隔
# 输出:apple, banana, cherryprint("Hello", end="")  # 不换行
print("World")          # 紧接着输出
# 输出:HelloWorld

在这里插入图片描述
输出格式化字符串(推荐)

name = "Bob"
age = 25# 方法1:f-string(推荐)
print(f"我的名字是{name},我今年{age}岁。")
print("我的名字是{name},我今年{age}岁。")# 方法2:.format()
print("我的名字是{},我今年{}岁。".format(name, age))

在这里插入图片描述

input() – 读取用户的输入

name = input("请输入你的名字:")
print("你好," + name)

input() 会暂停程序,等用户输入内容并按回车
输入内容是字符串(类型为 str)

如果你需要用户输入一个数字,比如整数或浮点数,需要手动转换:

age = int(input("请输入你的年龄:"))  # 转换为整数
height = float(input("请输入你的身高(米):"))  # 转换为浮点数
name = input("请输入你的名字:")
age = int(input("请输入你的年龄:"))
print(f"{name},你明年就 {age + 1} 岁了!")

在这里插入图片描述

基本数据类型

int、float、bool、str

# 整数(int)
a = 10# 浮点数(float)
pi = 3.14# 布尔值(bool)
is_ok = True     # 或 False# 字符串(str) 字符串可以用单引号或双引号包围。
name = "Alice"
sentence = 'Hello, world!'

常用 str 操作方法

方法作用示例
lower()转换为小写'Hello'.lower()'hello'
upper()转换为大写'Hello'.upper()'HELLO'
strip()去除前后空白字符' hi '.strip()'hi'
replace(old, new)替换字符串内容'a-b-c'.replace('-', '+')'a+b+c'
split(sep)拆分为列表'a,b,c'.split(',')['a', 'b', 'c']
join(iterable)用当前字符串连接序列','.join(['a', 'b'])'a,b'
find(sub)查找子串,返回索引'abc'.find('b')1
count(sub)子串出现次数'banana'.count('a')3
startswith(prefix)是否以 prefix 开头'hello'.startswith('he')True
endswith(suffix)是否以 suffix 结尾'hello'.endswith('lo')True
isdigit()是否是数字字符'123'.isdigit()True
isalpha()是否是字母'abc'.isalpha()True
isalnum()是否是字母或数字'abc123'.isalnum()True
format()格式化字符串'Name: {}'.format('Tom')'Name: Tom'
zfill(width)左侧补零'42'.zfill(5)'00042'
s = "  Hello, World!  "print(s.strip())            # 去空格 → "Hello, World!"
print(s.lower())            # 小写 → "  hello, world!  "
print(s.upper())            # 大写 → "  HELLO, WORLD!  "
print(s.replace(",", "."))  # 替换 → "  Hello. World!  "
print(s.split(","))         # 拆分 → ['  Hello', ' World!  ']
print(".".join(["a", "b"])) # 拼接 → "a.b"
print(s.find("World"))      # 查找 → 9
print(s.count("l"))         # 统计 → 3
print("12345".isdigit())    # True
print("abc123".isalnum())   # True
print("Hello".startswith("He"))  # True
str1='leilei@163.com'
list1=str1.split('@')
print('邮箱名是:',list1[0],'邮箱服务器:',list1[1])  # 邮箱名是: leilei 邮箱服务器: 163.com

🧠 提示:面试中优先记住这些!

strip() / lower() / replace() → 清洗字符串常用
split() / join() → 拆分与合并
find() / count() → 查找统计
startswith() / endswith() → 过滤文本
isdigit() / isalpha() / isalnum() → 验证输入格式
format() / f-string → 字符串格式化输出

格式化字符串的三种方式

在这里插入图片描述

#(1)使用占位符进行格式化
name='马冬梅'
age=19
score=98.5
print('姓名:%s,年龄:%d,成绩:%f' %(name, age, score))     # 姓名:马冬梅,年龄:19,成绩:98.500000
print('姓名:%s,年龄:%d,成绩:%.1f' %(name, age, score))   # 姓名:马冬梅,年龄:19,成绩:98.5#(2)f-string
print(f'姓名:{name},年龄:{age},成绩:{score}')    # 姓名:马冬梅,年龄:19,成绩:98.5#(3)使用字符串的format方法
print('姓名:{0},年龄:{1},成绩:{2}'.format(name,age,score))
print('姓名:{2},年龄:{0},成绩:{1}'.format(age,score,name))

在这里插入图片描述

数据验证方法

# isdigit() 十进制的阿拉伯数字
print('123'.isdigit())      # True
print('一二三'.isdigit())    # False
print('0b101'.isdigit())    # False
print('-'*50)# 所有字符都是数字
print('123'.isnumeric())    # True
print('一二三'.isnumeric())  # True
print('0b10'.isnumeric())   # False
print('Ⅱ'.isnumeric())      # 罗马数字 True
print('壹贰叁'.isnumeric())  # True
print('-'*50)# 所有字符都是字母(包含中文字符)
print('hello你好'.isalpha())   # True
print('hello你好123'.isalpha())   # False

字符串拼接

s1='hello'
s2='world'#第一种方式:使用加号'+'拼接
print(s1+s2)   # helloworld#第二种方式:使用字符串的join()方法
print(''.join([s1,s2]))  # helloworld  使用空字符串进行拼接
print('*'.join(['pyhon','java','linux','php']))  # pyhon*java*linux*php
print('你好'.join(['pyhon','java','linux','php'])) # pyhon你好java你好linux你好php#第三种方式:直接拼接
print('hello''world''你好')  # helloworld你好#第四种方式:使用格式化字符串
print('%s%s' %(s1,s2))   # helloworld
print(f'{s1}{s2}')   # helloworld
print('{0}{1}'.format(s1,s2))  # helloworld

字符串去重

s='helloworldhelloworldhelloworldhelloworldhelloworld'# 第一种方式:通过遍历字符及not in
new_s=''
for it in s:if it not in new_s:new_s+=it
print(new_s)     # helowrd# 第二种方式:使用索引+ not in
new_s2=''
for i in range(len(s)):if s[i] not in new_s2:new_s2+=s[i]
print(new_s2)   #  helowrd# 第三种方式:通过集合去重+列表排序
new_s3=set(s)
lst=list(new_s3)
lst.sort(key=s.index)
print(''.join(lst)) #  helowrd

lst.sort(key=s.index) 排序

这一行是关键!
s.index(x) 会返回字符 x 在原字符串中第一次出现的索引位置。
key=s.index 让 sort 以字符在原字符串的首次出现位置为排序依据。

key 不是你定义的变量,而是 sort() 方法的一个参数名字,它用来指定排序时的比较依据(规则)。

key 参数的作用

  1. list.sort() 和 sorted() 都有一个可选的参数 key。
  2. 它要求你传入一个函数(或可调用对象),这个函数接收一个元素,返回一个用来比较大小的值。
  3. 排序时,Python 会对列表里的每个元素调用这个函数,把返回值当作排序的依据。

数据类型转换函数

在这里插入图片描述
隐式转换:Python主动完成
显示装换:使用下列函数:int()、float()、str()…等完成
在这里插入图片描述

目标类型函数示例
整数int(x)int("123")123
浮点数float(x)float("3.14")3.14
字符串str(x)str(123)"123"
布尔值bool(x)bool(0)False
列表list(x)list("abc")['a', 'b', 'c']
元组tuple(x)tuple([1,2])(1, 2)
集合set(x)set([1,1,2]){1, 2}
字典dict(x)dict([("a", 1), ("b", 2)])

str ↔ int / float(字符串 和 数字 之间转换)

# 字符串转整数
a = int("42")        # 42# 字符串转浮点数
b = float("3.14")    # 3.14# 数字转字符串
s = str(100)         # "100"

容器类型

列表(list):可变、可重复、有序

fruits = ["apple", "banana", "orange"]
fruits[0]        # 访问第一个元素 -> "apple"
fruits.append("grape")  # 添加元素

元组(tuple): 不可变、可重复、有序

元组是Python中不可变数据类型,它没有相关的增删改的一系列操作,它只能使用索引去获取元素和使用for循环去遍历元素。

所谓的"不可变“”意思是:

一旦创建,变量的“整体结构”就不能被修改。

也就是说:

  1. 元组本身的长度不能变(不能添加/删除元素)
  2. 元组中某个位置的元素不能被替换

❓但很多人疑问:如果元组里放的是“可变对象”,还能改吗?
✅ 答案是:可以修改可变对象的内容,但不能修改元组的结构!
来看看例子:

t = ([1, 2], 3)t[0].append(100)   # ✅ 这是合法的!
print(t)           # 输出:([1, 2, 100], 3)t[0] = [9, 9]      # ❌ 报错!不能替换整个元素

解释:

  1. 元组t包含两个元素:一个列表[1, 2]和一个整数3
  2. 你不能改变 t[0] 这个位置放的对象是谁(这属于元组结构),
  3. 但你可以修改 t[0] 这个列表内部的内容(因为列表是可变的)
point = (10, 20)
point[0]         # -> 10
# point[0] = 30  # ❌ 报错:tuple是不可变的,报错:'tuple' object does not support item assignment

元组的创建方式

  1. 使用()去定义元组,元素之间使用英文逗号分隔
    元组名=(element1,element2,element3,…elementN)
  2. 使用()内置函数 tuple() 创建元组
    元组名= tuple(序列)

删除元祖:del()

在这里插入图片描述
在这里插入图片描述

元组中只有一个元素时,逗号也不能省略

t=(10)
print(t,type(t))  #t输出的是一个int类型y=(10,)
print(y,type(y)) #y输出的才是元组类型

在这里插入图片描述
删除元组

del 元组名

在这里插入图片描述

元组元素的访问与遍历

在这里插入图片描述

#切片操作
t2=t[0:3:2]
print(t2)  # ('python', 'Linux')
# 元组的遍历
for i in t:print(i)
# for+range()+len()
for i in range(len(t)):print(i,t[i])打印结果
0 python
1 java
2 Linux
3 hello
4 word
# enumerate
for index, item in enumerate(t):print(index,">>>",item)打印结果
0 >>> python
1 >>> java
2 >>> Linux
3 >>> hello
4 >>> word

在这里插入图片描述
修改序号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集合(set):可变、不重复、无序

colors = {"red", "green", "blue"}
colors.add("yellow")

自动去重。
不能通过下标访问元素(因为无序)。

集合的创建

# {}直接创建集合
s={10,20,30,40}
print(s)# 集合只能存储不可变数据类型
#s={[10,20],[30,40]}
#print(s) # TypeError: unhashable type: 'list'# 使用set()创建集合
s=set() # 创建了一个空集合,空集合的布尔值是False
print(s)
s={}
print(s,type(s))  # {} <class 'dict'>s=set('helloworld')
print(s)   # {'l', 'd', 'r', 'e', 'h', 'o', 'w'} 无序不重复s2=set([10,20,30])
print(s2)  # {10, 20, 30}s3=set(range(1,10))
print(s3)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}

集合元素的操作方法

s3=set(range(1,10))
print(s3)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}# 集合属于序列中的一种
print('max:',max(s3))   # max: 9
print('min:',min(s3))   # min: 1
print('len:',len(s3))   # len: 9print('9在集合中存在吗?',(9 in s3))  # 9在集合中存在吗? True
print('9在集合中不存在吗?',(9 not in s3))   # 9在集合中不存在吗? Falsedel s3
print(s3) # NameError: name 's3' is not defined. Did you mean: 's'?

在这里插入图片描述

A={10,20,30,40,50}
B={30,50,88,76,20}# 交集操作
print(A&B)  # {50, 20, 30}
# 并集操作
print(A|B)  # {40, 10, 76, 50, 20, 88, 30}
# 差集操作
print(A-B)  # {40, 10}
print(B-A)  # {88, 76}
# 补集操作
print(A^B)  # {10, 88, 40, 76}
print(B^A)  # {40, 10, 88, 76}

集合的相关操作方法
在这里插入图片描述

A={100,10,20,30}
# 向集合中添加元素
A.add(40)
print(A)   # {100, 40, 10, 20, 30}# 删除集合中的元素
A.remove(20)
print(A)   # {100, 40, 10, 30}
A.pop()
print(A)   # {40, 10, 30}# 清空集合中所有元素
# A.clear()
# print(A)   # set()# 集合中的遍历
for item in A:print(item)  # 40 10 30# 使用enumerate()函数
for index,value in enumerate(A):print(index,'-->',value)
#输出结果:
# 0 --> 40
# 1 --> 10
# 2 --> 30# 集合的生成式
s={i for i in range(1,10)}
print(s)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}s={i for i in range(1,10) if i%2==1}
print(s)  # {1, 3, 5, 7, 9}

字典(dict):键值对,类似 Java 中的 Map

key --> value
字典中的键要求是不可变的序列(字符串、整数、浮点、元组都可以),列表是不允许作为字典的键(它的可变的)

person = {"name": "Alice", "age": 25}
person["name"]       # -> "Alice"
person["age"] = 26   # 修改

注意事项:

字典中的key是无序的,
Python3.5及其之前的版本字典的key在输出时无序,
但是从Python3.6版本之后Python解释器进行了处理,所以才会看到输出的顺序与添加的顺序“一致”

字典类型创建方式

第一种使用{}直接创建字典

d={key1:value1,key2:value2,key3:value3}

第二种使用内置函数dict()创建字典

dict(key1=value1,key2=value2…)

在这里插入图片描述

# 使用参数创建字典
d=dict(cat=10,dog=20)
print(d)   # {'cat': 10, 'dog': 20}
t=(10,20,30)
print({t:10})   # {(10, 20, 30): 10}  t是key,10是value,元组是可以作为字典中的key的

列表不能作为字典的键
在这里插入图片描述
字典元素的max()、min()、len() 和删除
在这里插入图片描述

字典元素的访问和遍历

d={'hello':10,'world':20,'python':30}
# 访问字典中的元素
# (1)使用d[key]
print(d['hello'])  # 10# (2)d.get(key)
print(d.get('hello')) # 10

取值时,(1)d[key] 和 (2)d.get(key) 是有区别的
如果key不存在

  1. d[key]会报错
  2. d.get[key]可以指定默认值

d[key]会报错
在这里插入图片描述

d.get[key]可以指定默认值
在这里插入图片描述
遍历字典元素
在这里插入图片描述

字典相关操作方法

在这里插入图片描述
在这里插入图片描述

d={1001:'小米',1002:'小明',1003:'小红'}
print(d)# 想字典中添加元素
d[1004]="小磊"
print(d)# 获取字典中所有的key
keys=d.keys()
print(keys)        # dict_keys([1001, 1002, 1003, 1004])
print(list(keys))    #  [1001, 1002, 1003, 1004]
print(tuple(keys))   #  (1001, 1002, 1003, 1004)# 获取字典中所有的value
values=d.values()
print(values)         # dict_values(['小米', '小明', '小红', '小磊'])
print(list(values))    # ['小米', '小明', '小红', '小磊']
print(tuple(values))   # ('小米', '小明', '小红', '小磊')# 如何将字典中的数据转换成key-value的形式,以元组的方式进行展现
lst=list(d.items())
print(lst)  # [(1001, '小米'), (1002, '小明'), (1003, '小红'), (1004, '小磊')]d=dict(lst)
print(d)   # {1001: '小米', 1002: '小明', 1003: '小红', 1004: '小磊'}# 使用pop函数
print(d.pop(1004))  # 小磊
print(d)   # {1001: '小米', 1002: '小明', 1003: '小红'}print(d.pop(1008,'不存在'))# 随机删除
print(d.popitem())  # (1003, '小红')
print(d)   # {1001: '小米', 1002: '小明'}# 清空字典中所有的元素
d.clear()
print(d)  # {}# python中一切皆对象,每个对象都有一个布尔值
print(bool(d))   # False 空字典的布尔值为False

字典类型生成式

在这里插入图片描述

列表、元组、字典、集合的区别

在这里插入图片描述

正则表达式

元字符

在这里插入图片描述

限定符

在这里插入图片描述

其他字符

在这里插入图片描述

re模块

re是python中的内置模块,用于实现python中的正则表达式操作。
在这里插入图片描述

match函数的使用

import re   # 导入re模块
pattern='\d\.\d+'  #  +限定符,\d 0-9数字出现1次或多次
s='I study Python 3.11 every day' # 代匹配字符串
match=re.match(pattern,s,re.I)  # 从头开始查找
print(match)   # None, 因为开头没有数字所以为nones2='3.11I study Python every day'
match2=re.match(pattern,s2,re.IGNORECASE)
print(match2)  # <re.Match object; span=(0, 4), match='3.11'>  /找到了,还告诉了范围span=(0, 4)print('匹配值的起始位置:', match2.start())    # 匹配值的起始位置: 0
print('匹配值的结束位置:', match2.end())      # 匹配值的结束位置: 4
print('匹配区间的位置元素:', match2.span())   # 匹配区间的位置元素: (0, 4)
print('待配区间的字符串:', match2.string)     # 待配区间的字符串: 3.11I study Python every day
print('匹配的数据:', match2.group())         # 匹配的数据: 3.11

函数的定义和调用

自定义函数

 def 函数名词 (参数列表):函数体[return 返回值列表]
def get_num(num):   # num是形式参数s = 0for i in range (1,num+1):s+=iprint(f'1到{num}之间的累加和是:{s}')# 函数的调用
get_num(10)      # 1到10之间的累加和是:55     # 10是实际参数
get_num(100)     # 1到100之间的累加和是:5050
get_num(1000)    # 1到1000之间的累加和是:500500print(get_num(1))   # None

其中 get_num(num) 中num是形式参数,get_num(10)中 10,100…是实际参数
在这里插入图片描述
如果一个函数没有通过return显示的返回一个内容,python也会默认的给此函数返回一个“None”,可以通过print() 函数答应这个默认的返回值

变量的作用域

在这里插入图片描述
局部变量的使用

def calc(a,b):x=5s=x+a+breturn sprint(calc(10,20))  # 35 
# print(x)    # x是calc(a,b)内部定义的,所以打印会报错NameError: name 'x' is not defined  

在这里插入图片描述
全局变量的使用

a=100def calc(x,y):s=a+x+yreturn s
print(a)                     # 100
print(calc(10,20))      # 130
print("--"*30)def calc1(x,y):a=200        # 局部变量命名与全局变量重名s=a+x+y      # a=200参与了此函数中的计算,也就是说当局部变量命名与全局变量重名时,局部变量的优先级更高。return s
print(a)                     # 100
print(calc1(10,20))    # 230
print("--"*30)def calc2(x,y):global b    # b是在函数中定义的变量,但是使用了global关键字声明,此时b就变成了全局变量b=300       # 声明和赋值,必须是分开编写的s=b+x+yreturn s
print(b)      # NameError: name 'b' is not defined
print(calc2(10,20))   # 330
print(b)                    # 因为 b被global声明为全局变量,所以b可以在calc2函数之外被打印出来,但在函数被调用之前会报错

匿名函数lambda

lambda
是指没有名字的函数,这种函数只能使用一次,一般是在函数的函数体只有一句代码且只有一个返回值时,可以使用匿名函数来简化。

语法结构:result=lambda 参数列表:表达式

def calc(a,b):return a+b
print(calc(10,20))  # 30
print('+'*30)#将calc(a,b)改为匿名函数
s=lambda a,b:a+b    # 此时s就是一个匿名函数
print(type(s))      # <class 'function'>#调用匿名函数
print(s(10,15))
print('@'*30)

在这里插入图片描述

# 正常的列表循环取值
lst=[5,10,15,35,55]
for i in range(len(lst)):print(lst[i])
print('++'*30)# 使用lambda匿名函数取值
for i in range(len(lst)):result=lambda x:x[i]   # 根据索引取值,result的类型是function, x是形式参数print(result(lst))     # lst是实际参数

在这里插入图片描述

# 对列表按照score分数排序
student_score=[{'name':'小明','score':92},{'name':'红红','score':73},{'name':'濛濛','score':100},{'name':'蕾蕾','score':69},
]
student_score.sort(key=lambda x:x.get('score'),reverse=True)
print(student_score)   # [{'name': '濛濛', 'score': 100}, {'name': '小明', 'score': 92}, {'name': '红红', 'score': 73}, {'name': '蕾蕾', 'score': 69}]

在这里插入图片描述

类与对象

类的组成

在这里插入图片描述

class Student:# 类的属性:定义在类中,方法外的变量school='长江大学'# 初始化方法def __init__(self,name,age): # name,age是初始化方法的形式参数,是局部变量,name,age的作用域是整个__init__方法self.name=name  # =左侧self.name是实例属性,右边name是局部变量,将局部变量的值xm赋值给实例属性self.nameself.age=age    # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,称为方法,自带一个参数selfdef show(self):print(f'我叫:{self.name},今年:{self.age}岁了')# 静态方法@staticmethoddef sm():print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')@classmethoddef cm(cls):  # cls --> class的简写print('这是一个类方法,不能调用实例属性,也不能调用实例方法')#创建类的对象
stu=Student('lei',13)  #为什莫这里传入了两个参数,因为__init__方法中有两个形参,self是自带的参数,无需手动传入
print(stu)    # <__main__.Student object at 0x000002A493379B50>
#实例属性,使用对象名进行打点调用
print(stu.name,stu.age)  # lei 13
#类属性,直接使用类名打点调用
print(Student.school)    # 长江大学
#实例方法,使用对象名打点调用
stu.show()  # 我叫:lei,今年:13岁了#类方法,@classmethod进行修饰的方法,直接使用类名打点调用
Student.cm()   # 这是一个类方法,不能调用实例属性,也不能调用实例方法#静态方法,@staticmethod进行修饰的方法,直接使用类名打点调用
Student.sm()   # 这是一个静态方法,不能调用实例属性,也不能调用实例方法

创建多个类的实例对象

class Student:# 类的属性:定义在类中,方法外的变量school='长江大学'# 初始化方法def __init__(self,name,age): # name,age是初始化方法的形式参数,是局部变量,name,age的作用域是整个__init__方法self.name=name  # =左侧self.name是实例属性,右边name是局部变量,将局部变量的值xm赋值给实例属性self.nameself.age=age    # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,称为方法,自带一个参数selfdef show(self):print(f'我叫:{self.name},今年:{self.age}岁了')stu=Student('萌萌',4)
stu1=Student('泪泪',8)
stu2=Student('微微',12)
stu3=Student('小小',9)lst=[stu,stu1,stu2,stu3]
for item in lst:item.show()

在这里插入图片描述

动态绑定属性和方法

class Student:# 类的属性:定义在类中,方法外的变量school='长江大学'# 初始化方法def __init__(self,name,age): # name,age是初始化方法的形式参数,是局部变量,name,age的作用域是整个__init__方法self.name=name  # =左侧self.name是实例属性,右边name是局部变量,将局部变量的值xm赋值给实例属性self.nameself.age=age    # 实例的名称和局部变量的名称可以相同# 定义在类中的函数,称为方法,自带一个参数selfdef show(self):print(f'我叫:{self.name},今年:{self.age}岁了')stu=Student('萌萌',4)
stu1=Student('泪泪',8)#给stu1动态绑定一个除了name和age的另外的属性
stu1.gender='男'
print(stu1.name,stu1.age,stu1.gender)  # 泪泪 8 男# 动态绑定方法
def introduce():print('我是一个普通的函数,我被动态绑定成了su1对象的方法')
stu1.meth=introduce  #函数的赋值#调用
stu1.meth()  # 我是一个普通的函数,我被动态绑定成了su1对象的方法

封装、继承、多态

在这里插入图片描述

封装

在这里插入图片描述

class Student():# 首尾双下划线def __init__(self,name,age,gender):self._name=name     # self._name受保护的,只能本类和子类访问self.__age=age      # self.__age 表示私有的,只能本身去访问self.gender=gender  # 普通的示例属性,类的内部,外部,以及子类都可以访问def _fun1(self):  # 受保护的print('子类及本身可以访问')def __fun2(self):  # 私有的print('只有定义的类可以访问')def show(self):  # 普通的实例方法self._fun1()   # 类本身访问受保护的方法self.__fun2()  # 类本身访问私有方法print(self._name)  # 受保护的实例属性print(self.__age)  # 私有的实例属性# 创建一个学生类的对象
stu=Student('蕾蕾',18,'男')
# 类的外部
print(stu._name)   # 蕾蕾
print(stu.__age)   # AttributeError: 'Student' object has no attribute '__age'. Did you mean: '_name'? 超出类的定义范围就不能用了# 调用受保护的实例方法
#stu._fun1()  # 子类以及本身可以访问

在这里插入图片描述

访问私有属性和方法
class Student():# 首尾双下划线def __init__(self,name,age,gender):self._name=name     # self._name受保护的,只能本类和子类访问self.__age=age      # self.__age 表示私有的,只能本身去访问self.gender=gender  # 普通的示例属性,类的内部,外部,以及子类都可以访问def _fun1(self):  # 受保护的print('子类及本身可以访问')def __fun2(self):  # 私有的print('只有定义的类可以访问')def show(self):  # 普通的实例方法self._fun1()   # 类本身访问受保护的方法self.__fun2()  # 类本身访问私有方法print(self._name)  # 受保护的实例属性print(self.__age)  # 私有的实例属性# 创建一个学生类的对象
stu=Student('蕾蕾',18,'男')#私有的实例属性和方法是真的不能访问吗
print(stu._Student__age)    # 18  访问私有属性需要通过对象名Student来访问
stu._Student__fun2()        # 只有定义的类可以访问

在这里插入图片描述

dir() 函数。
print(dir(stu))

我们可以通过dir() 内置函数,可以看出stu这个对象中的所有属性和方法。也看一看出权限访问控制在这里的是怎么第一书写规范的。

['_Student__age', '_Student__fun2', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_fun1', '_name', 'gender', 'show']

继承

多态

Object 类

在这里插入图片描述

对象的特殊方法

在这里插入图片描述

特殊属性

在这里插入图片描述

模块

常用内置模块

在这里插入图片描述

random 模块

在这里插入图片描述

time 模块

在这里插入图片描述
时间格式化字符串
在这里插入图片描述

datetime 模块

在这里插入图片描述

os 模块

在这里插入图片描述
在这里插入图片描述

import osprint('当前的工作路径:',os.listdir())
lst=os.listdir()
print('当前路径下的所有目录以及文件:',lst)
print('指定路径下所有目录以及文件:',os.listdir('E:/PythonProject'))# 创建目录
os.mkdir('好好学习')  # 若文件已存在,则报错FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: '好好学习'

在这里插入图片描述

常用第三方模块

第三方模块的安装与卸载

在这里插入图片描述
爬虫库的安装

pip install requests

在这里插入图片描述

requests

在这里插入图片描述

爬取景区的天气预报
import re
import requests
url='https://www.weather.com.cn/weather40d/101280601.shtml'   # 爬虫打开的浏览器上的网页
resp=requests.get(url)   # 打开浏览器并打开网址
# 设置编码格式
resp.encoding='utf-8'
print(resp.text)         # resp相应对象,对象名.属性名 resp.textcity=re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>',resp.text)
weather=re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>',resp.text)
wd=re.findall('<span class="wd">(.*)</span>',resp.text)
zs=re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>',resp.text)print(city)
print(weather)
print(wd)
print(zs)lst=[]
for a,b,c,d in zip(city,weather,wd,zs):lst.append([a,b,c,d])
print(lst)
for item in lst:print(item)

在这里插入图片描述

爬取百度LOGO图片
import requests
url='https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
resp=requests.get(url)# 保存图片到本地
with open('logo.png','wb')as file:file.write(resp.content)

在这里插入图片描述
在这里插入图片描述

openpyxl

在这里插入图片描述

将爬取到景区的天气预报数据保存在Excel中

先封装爬取到的天气信息,以便在保存到Excel代码中可以import
weather.py

import re
import requestsdef get_html():url='https://www.weather.com.cn/weather40d/101280601.shtml'   # 爬虫打开的浏览器上的网页resp=requests.get(url)   # 打开浏览器并打开网址# 设置编码格式resp.encoding='utf-8'return resp.textdef parse_html(html_str):city=re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>',html_str)weather=re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>',html_str)wd=re.findall('<span class="wd">(.*)</span>',html_str)zs=re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>',html_str)lst=[]for a,b,c,d in zip(city,weather,wd,zs):lst.append([a,b,c,d])return lst

保存Excel代码

import weather
import openpyxlhtml=weather.get_html()  # 发请求,得响应结果
lst=weather.parse_html(html) # 解析数据# 创建一个新的Excel工作簿
workbook=openpyxl.Workbook()  # 创建对象,注意这里要加括号()# 在Excel文件中创建工作表
sheet=workbook.create_sheet('景区天气')# 向工作表中添加数据
for item in lst:sheet.append(item)  # 一次添加一行workbook.save('景区天气.xlsx')

在这里插入图片描述
在这里插入图片描述
再从Excel中读取数据

import openpyxl
# 打开工作簿
workbook=openpyxl.load_workbook('景区天气.xlsx')# 选择要操作的工作表
sheet=workbook['景区天气']# 表格数据是二维列表,先遍历的是行,后遍历的是列
lst=[] # 存储的是行数据
for row in sheet.rows:sublst=[] # 存储单元格数据for cell in row: #  cell单元格sublst.append(cell.value)lst.append(sublst)for item in lst:print(item)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94503.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94503.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94503.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据可视化-98】2025年上半年地方财政收入Top 20城市可视化分析:Python + Pyecharts打造炫酷暗黑主题大屏

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【基础-单选】向服务器提交表单数据,以下哪种请求方式比较合适

向服务器提交表单数据&#xff0c;以下哪种请求方式比较合适A.RequestMethod.GET B.RequestMethod.PUT C.RequestMethod.POST D.RequestMethod.DELETE 解释如下&#xff1a; 在HarmonyOS应用开发中&#xff0c;向服务器提交表单数据&#xff0c;C. RequestMethod.POST 是比较合…

论文阅读:Code as Policies: Language Model Programs for Embodied Control

地址&#xff1a;Code as Policies: Language Model Programs for Embodied Control 摘要 针对代码补全任务训练的大型语言模型&#xff08;LLMs&#xff09;已被证实能够从文档字符串&#xff08;docstrings&#xff09;中合成简单的 Python 程序。研究发现&#xff0c;这些…

Vue 3 customRef 完全指南:自定义响应式引用的终极教程

&#x1f4d6; 概述 customRef() 是 Vue 3 中用于创建自定义响应式引用的组合式 API。它允许开发者完全控制响应式数据的读取和写入行为&#xff0c;为复杂的响应式逻辑提供了强大的灵活性。 &#x1f3af; 基本概念 什么是 customRef&#xff1f; customRef() 是一个工厂函数…

Java项目-苍穹外卖_Day1

项目来源&#xff1a; 【黑马程序员 Java项目实战《苍穹外卖》】 [https://www.bilibili.com/video/BV1TP411v7v6] ZZHow(ZZHow1024) 软件开发整体介绍 软件开发流程 需求分析&#xff1a;需求规格说明书、产品原型。设计&#xff1a;UI 设计、数据库设计、接口设计。编码…

面试可能问到的问题思考-MySQL

MySQL 1. 数据库与缓存的一致性 引入缓存&#xff0c;因为缓存只是数据库数据的副本&#xff0c;那么就可能存在副本和原数据不一致的情况 一致性 ACID里面的C&#xff0c;和CAP中的C不是一个概念&#xff0c;虽然都叫一致性。CAP中的C&#xff0c;指的是多个副本之间逻辑上…

【Java】 Spring Security 赋能 OAuth 2.0:构建安全高效的现代认证体系

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在当今数字化时代,认证与授权已成为应用系统安全的核心。OAuth 2.0 作为一种开放标准协议,广泛应用于第三方授权场景中,而 Spring Security 则提供了强大的框架支持来实现这一协议。本文深…

实际工作几月后常用相关命令笔记记录

目前&#xff0c;我这只工程师幼崽经历几个月的工作&#xff0c;不能说是收获很多&#xff0c;也算是成长经验1吧。主要工作后才知道好多东西都是自己不会的不了解的&#xff0c;但是工作需要不一定自己完全吃透&#xff0c;在合适的地方正确的使用一般情况就ok了&#xff0c;所…

突破传统文本切片的瓶颈:AntSK-FileChunk语义切片技术详解前言:为什么我们需要重新思考文本切片?

在当今大语言模型&#xff08;LLM&#xff09;应用蓬勃发展的时代&#xff0c;我们面临着一个看似简单却至关重要的问题&#xff1a;如何有效地处理长文本&#xff1f;无论是构建知识库、实现RAG&#xff08;检索增强生成&#xff09;系统&#xff0c;还是进行文档智能分析&…

LeetCode-542. 01 矩阵

1、题目描述给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1&#xff1a;输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;[[…

Elasticsearch如何确保数据一致性?

Elasticsearch 通过多种机制确保数据在分布式环境中的一致性&#xff0c;但由于其分布式和近实时&#xff08;Near Real-Time, NRT&#xff09;的特性&#xff0c;它提供的是最终一致性&#xff08;Eventual Consistency&#xff09;&#xff0c;而非强一致性。以下是核心机制和…

2026毕设选题-大数据-基于 Spring Boot的化妆品推荐系统的设计与实现

技术范围&#xff1a;大数据、物联网、SpringBoot、Vue、SSM、HLMT、小程序、PHP、Nodejs、Python、爬虫、数据可视化、安卓App、机器学习等设计与开发。 主要内容&#xff1a;功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长…

数据结构算法:顺序表

数据结构&#xff1a;顺序表一.寄包柜1.题目如何创建数组&#xff1f;1. 需求本质2. 传统静态数组的缺陷3. 动态方案&#xff1a;向量的数组4. 核心逻辑5. 关键优势总结2.解题思路2.1题目分析2.2具体解题逻辑拆解步骤2.3总结2.4参考代码二.移动零1.题目2.解题思路2.1**解题核心…

IIS 安装了.netcore运行时 还是报错 HTTP 错误 500.19

IIS 安装了.netcore运行时 还是报错 HTTP 错误 500.19 - Internal Server Error 错误代码 0x8007000d 我甚至是先安装的SDK&#xff0c;再安装的运行时runtime的安装包&#xff0c;都不行。 而且在IIS的模块中&#xff0c;找不到 AspNetCoreModuleV2。 最后在微软官网n…

Flink 滑动窗口实战:从 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程

一、业务背景 我们要在 Flink 实时流上统计 每个用户-品牌组合最近 1 小时的最晚行为时间&#xff0c;并且每 5 分钟更新一次结果。 数据来自 Kafka&#xff0c;事件类型为 CartEvent&#xff1a; public class CartEvent {public String userId;public String brandId;public …

Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市

导读&#xff1a; 如果把你的Kubernetes集群想象成一座拔地而起的现代化大都市&#xff0c;那么你&#xff0c;平台工程师&#xff0c;就是这座城市的首席规划师。然而&#xff0c;为何我们精心打造的许多“云原生都市”正迅速陷入交通拥堵、资源闲置和预算超支的困境&#xff…

2.4 Flink运行时架构:Task、SubTask、ExecutionGraph的关系

在理解Flink运行时架构之前&#xff0c;我们先用一个生活化的比喻来建立直观认识&#xff1a; 想象你是一家大型工厂的总经理&#xff0c;需要生产一批复杂的产品。你会怎么做&#xff1f; 制定生产计划&#xff1a;首先画出生产流程图&#xff0c;明确每个环节的工作内容分解任…

`mysql_query()` 数据库查询函数

1) 函数的概念与用途 mysql_query() 是 MySQL C API 中的核心函数&#xff0c;用于向 MySQL 服务器发送 SQL 查询语句。这个函数充当了 C/C 应用程序与 MySQL 数据库之间的桥梁&#xff0c;允许程序执行各种数据库操作。 可以将 mysql_query() 想象成一个"数据库信使"…

[系统架构设计师]通信系统架构设计理论与实践(十七)

[系统架构设计师]通信系统架构设计理论与实践&#xff08;十七&#xff09; 一.通信系统网络架构 形式: 局域网&#xff0c;广域网&#xff0c;移动通信网 1.局域网网络架构 单一机构专用计算机的网络 组成&#xff1a;计算机&#xff0c;交换机&#xff0c;路由器 特点&#x…

【赵渝强老师】Docker的私有镜像仓库:Harbor

Harbor是由VMware公司开发并开源的企业级的Docker镜像仓库的管理项目&#xff0c;它包括镜像的权限管理&#xff08;RBAC&#xff09;、目录访问&#xff08;LDAP&#xff09;、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 视频讲解如下 【赵渝强老师】Docker的…