python小白考前复习
模块的导入
函数与模块的理解
函数就是一个用于专门实现某个功能的代码块(可重用),而模块就是大量具有相似功能的函数集合成的文件。可以这么理解,函数就是螺丝刀,你每次拧螺丝的时候把它取出来,模块就是一个工具包,这个包里放得都是跟螺丝有关的工具,它们有相似的功能。
-
函数,一个用于专门实现某个功能的代码块(可重用)。
-
内置函数
-
自定义函数
-
-
模块,集成了很多功能的函数集合。
-
内置模块,Python内部帮助我们提供好的。
import decimal v1 = decimal.Decimal("0.1") v2 = decimal.Decimal("0.2") v3 = v1 + v2 print(v3) # 0.3
-
第三方模块,网上下载别人写好的模块(功能集合)。
-
自定义模块
-
关于模块,提高代码复用性
- 模块就好比是工具包。要想使用这个工具包中的工具,就需要导入import这个模块,就像哆啦A梦的百宝袋
- 每一个已扩展名py结尾的python源代码文件都是一个模块
- 在模块中定义的全局变量函数都是模块能够提供给外界直接使用的工具
导入
现在pycharm里准备好my_module作为模块文件,另一个作为测试文件(最好用英文名)
在my_module.py里我们写下如下代码
author="RADO"
#注意在函数里多行注释一定要缩进
def add(a,b):
'''
计算两数和
'''
return a+b
我们在测试文件里写下如下代码
import my_module#导入模块
result=my_module.add(1,2)#通过点符号调用
print(result)
print(my_module.author)#某块内的全局变量也可以使用,但我们在这里修改它不影响模块文件的结果
有时我们不需要全导入可以这样做
from my_module import add
result=my_module.add(1,2)
print(result)
print(my_module.author)
但此时出现报错NameError: name 'my_module' is not defined
from my_module import add
result=add(1,2)
print(result)
print(author)#现在仅剩这一处仍报错
现在还有一个报错NameError: name 'author' is not defined
,因为我们只导入了add没有导入author
from my_module import add,author
result=add(1,2)
print(result)
print(author)
现在就没问题了
我们还可以这样用*
操作,既导入了全部,又不需要再写my_module
from my_module import *
result=add(1,2)
print(result)
print(author)
当然还有改名操作
from my_module import add as f,author as a
result=f(1,2)
print(result)
print(a)
包
包是Python模块的一种组织形式,将多个模块组合在一起,形成一个大的Python工具库。包通常是一个拥有__init__.py文件的目录,它定义了包的属性和方法
有的时候,不同模块管理不同的事情,所以我们再建一个包。
建立包
注意这回我们新建的是python软件包(带小圆圈的那个图案)
新建好之后,init.py的文件自动出现了,我们可以在里面写一些初始化的东西
然后我们将刚写好的模块文件拖过来。
这个时候导入包就和导入模块差不多了,比如导入包中的特定模块可以这样
from my_package.my_module import add as f,author as a
result=f(1,2)
print(result)
print(a)
也可以这样
from my_package import my_module
result=my_module.add(1,2)
print(result)
如果你的包里有很多模块的话,还可以这样
from my_package import *
result=my_module.add(1,2)
print(result)
random模块
练习题:随机生成8位密码,由数字和字母组成
import random
# 生成数字字符的列表
digits = [chr(i) for i in range(48, 58)]
# 生成大写字母和小写字母的列表
ascii_letters = [chr(i) for i in range(65, 91)] + [chr(i) for i in range(97, 123)]
# 数字的个数随机产生
num_of_numeric = random.randint(1, 7)
# 剩下的都是字母
num_of_letter = 8 - num_of_numeric
# 随机生成数字
numerics = [random.choice(digits) for i in range(num_of_numeric)]
# 随机生成字母
letters = [random.choice(ascii_letters) for i in range(num_of_letter)]
# 结合两者
all_chars = numerics + letters
# 重新排列
random.shuffle(all_chars)
# 生成最终字符串
result = "".join([i for i in all_chars])
print(result)
这个练习题做完后,我们不妨把它加入我们的工具库中,变成我们随时可以使用的工具,首先需要把它拆分改造成函数,把每个功能拆分出来
import random
def random_numerics():
# 数字的个数随机产生
num_of_numeric = random.randint(1, 7)
return num_of_numeric
num=random_numerics()
def choice_numerics():
# 生成数字字符的列表
digits = [chr(i) for i in range(48, 58)]
# 随机生成数字
numerics = [random.choice(digits) for i in range(num)]
return numerics
def random_letters():
# 生成大写字母和小写字母的列表
ascii_letters = [chr(i) for i in range(65, 91)] + [chr(i) for i in range(97, 123)]
return ascii_letters
# 剩下的都是字母
lnum=8-num
def choice_letters():
ascii_letters = random_letters()
# 随机生成字母
letters = [random.choice(ascii_letters) for i in range(lnum)]
# 结合两者
all_chars = choice_numerics() + letters
# 重新排列
random.shuffle(all_chars)
return all_chars
def password_8():
pwd=choice_letters()
# 生成最终字符串
result = "".join([i for i in pwd])
return result
石头剪刀布小游戏的实现
import random
def s_j_b():
player_score, computer_score = 0, 0
for i in range(3):
player = input("请输入石头、剪刀、布中的一种:")
computer = random.choice(['石头', '剪刀', "布"])
print("电脑出的是{}".format(computer))
if (player == "石头" and computer == " 剪刀") or \
(player == "剪刀" and computer == " 布") or \
(player == "布" and computer == " 石头"):
player_score += 1
print("玩家得分{},电脑得分{}".format(player_score, computer_score))
elif player == computer:
computer_score += 1
player_score += 1
print("玩家得分{},电脑得分{}".format(player_score, computer_score))
else:
computer_score += 1
print("玩家得分{},电脑得分{}".format(player_score, computer_score))
if player_score > computer_score:
print("玩家胜利,得分{}".format(player_score))
elif player_score < computer_score:
print("再战一次")
else:
print("太极了")
正则表达式
更详细的看这里
验证用户输入的是否是合理的身份证号,如果不用正则表达式,这个if_else起来就非常麻烦
import re
result=re.match("hello","hello world")
print(result)#<re.Match object; span=(0, 5), match='hello'>
这意味着在0~5的范围内找到了“hello”
\d:匹配数字
没有加号只在第一个位置匹配
import re
result=re.match(r"\d","123445678")
print(result)#<re.Match object; span=(0, 1), match='1'>
有了加号就意味着在若干个地方
import re
result=re.match(r"\d+","123445678")
print(result)
#<re.Match object; span=(0, 9), match='123445678'>
你还可以连着写
import re
result=re.match(r"\d\d\d","123445678")
print(result)#<re.Match object; span=(0, 3), match='123'>
\w:匹配字母数字及下划线
result=re.match(r"\w","a8")
print(result)#<re.Match object; span=(0, 1), match='a'>
result=re.match(r"\w+","a8*")
print(result)#<re.Match object; span=(0, 2), match='a8'>
注意加号是连续地检测,将星号移到中间之后就检测不到8了
result=re.match(r"\w+","a*8")
print(result)#<re.Match object; span=(0, 1), match='a'>
\s:空白字符(\n\t\r\f),$匹配结尾,^匹配开头
result=re.match(r"\s+$"," dvcx")
print(result)
result=re.match(r"^code\d-\d-.+$","code9-3-re")
print(result)#<re.Match object; span=(0, 10), match='code9-3-re'>
time
import time
t=time.time()#时间戳:1970
print(t)
t=time.localtime()#结构化时间:time.struct_time(tm_year=2024, tm_mon=6, tm_mday=11, tm_hour=21, tm_min=16, tm_sec=50, tm_wday=1, tm_yday=163, tm_isdst=0)
print(t)
print(t.tm_year,type(t.tm_year))#2024 <class 'int'>
s=time.strftime("%Y %M %d %H:%M%S",t)
print(s)#2024 19 11 21:1927
turtle
import turtle
pen=turtle.Turtle()
pen.speed(0)
for i in range(100):
pen.forward(100+i)
pen.left(99)
pen.forward(100)
结果如下图
import turtle,time
pen=turtle.Turtle()
pen.backward(200)
pen.speed(0)
count=0
while True:
time.sleep(1)
times=time.strftime("%Y %M %d %H:%M%S",time.localtime())
pen.clear()
pen.write(times,font=("Arial",90,"normal"))
count=count+1
if count==100:
break
安装第三方库
可以在终端输入以下命令
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
再安装一个库,这时速度会快很多
pip install pygame