python中的循环
1. while循环
语法格式
while 循环条件:
循环体
案例:计算 1到100之间的累加和
while循环不要忘记i的自身累加
i = 1
#累加和的结果
sum_num = 0
while i <= 100:
# 对count进行累加
sum_num = sum_num + i
# i = i + 1
# python中并没有设置i++操作,使用i+=1进行操作
i += 1
print(sum_num)
break continue 在循环中的应用
- break是 跳出本层循环
- continue是 跳过本次循环(执行下一个循环)
pass 关键字
i = 1
sum_num = 0
while i <= 100:
pass # pass 是空语句(占位)
生成一定范围内的随机数
导入随机数模块
from random import randint # 左闭右闭
print(randint(10,15))
# 验证randint的左闭右闭
while True:
print(randint(10,15))
案例:
需求一:sum_num累加的和大于1000的时候退出循环
i = 1
sum_num = 0
while i <= 100:
sum_num += i
if sum_num > 1000:
# 执行跳出本层循环
break
i += 1
print(sum_num)
# 1035
需求二:计算1到100之间的奇数和
i = 1
sum_num = 0
while i <= 100:
# 把所有的偶数都过滤掉 % 代表取余操作
if i % 2 == 0: # 偶数的时候跳出循环
i += 1 # (注意这个条件,否则死循环)
continue
sum_num += i
i += 1
print(sum_num)
# 2500
猜数字游戏
需求
- 在控制台中输入:请给定要猜的最大数字,请给定要猜的最小数字
- eg: [1,100] 给定数字的区间,电脑在这个区间随机生成一个数字
- 我们要在1 到100 之间猜出这个数字,因为一次猜对的可能性小,
- 我们要在每次猜的时候提示猜大了还是猜小了,
- 如果猜1 次就对,提示你也太厉害了吧,这是高手!
- 如果猜2-5 次对,提示恭喜你只用了i次就猜对了数字!
- 如果猜5 次以上,提示,你也太菜了,i 次才能猜的出来,洗洗睡吧!
自己写的代码(错的)
from random import randint
min_num = input('请给定要猜的最小数字:')
max_num = input('请给定要猜的最大数字:')
min_num = int(min_num)
max_num = int(max_num)
c_num = input('请猜是什么数字:')
c_num = int(c_num)
# i是猜的次数
i = 1
while True:
true_num = randint(min_num, max_num)
if c_num = true_num and i = 1:
print('你也太厉害了吧,这是高手!')
i += 1
老师的代码
from random import randint
# 最大数字
max_num = int(input('请给定要猜的最大的数字'))
# 最小数字
min_num = int(input('请给定要猜的最小的数字'))
# 随机生成一个数字,让用户猜这个数字
generate_num = randint(min_num, max_num)
count = 0
while True:
count += 1
guess_num = int(input('请输入您要猜的数字'))
if guess_num < generate_num:
print('您猜小了')
elif guess_num > generate_num:
print('您猜大了')
else:
# 猜对的情况
if count == 1:
print('你也太厉害了吧,1次就猜对了,高手')
elif count > 1 and count < 6:
print('恭喜只用了', count, '次就猜对了数字')
else:
print('你也太菜了吧,', count, '次才能猜的出来,嘻嘻睡吧')
break
2. for循环
语法格式
for 临时变量 in 可迭代对象: # 可迭代对象:列表,字符串,元祖,集合
循环体
案例:
- 分别取出 neusoft 中的每一个字母
临时变量不需要提前声明
name = 'neusoft'
# 遍历这个单词的每一个字母
for x in name:
print(x)
- 1 到 100 的奇数和 快捷方式
range(起始位置,终止位置,步长)函数生成的是左闭右开的区间数
sum_num = 0
for i in range(1, 101, 2):
sum_num += i
print(sum_num)
- for (int i=0; i<100;i++){
循环体
}
python中如何实现刚才这样的操作呢
1 到100 的累加和
sum_num = 0
for i in range(1, 101):
sum_num += i
print(sum_num)
案例:使用for 循环打印九九乘法表
自己的代码(错的)
for i in range(1, 10):
for j in range(1, 10):
j += 1
# print(str(i)*str(j)= i*j) # 怎么输出i*j?
i += 1 # 逻辑混乱
老师的代码
for i in range(1, 10):
for j in range(1, i+1):
print(j, 'x', i, '=', i*j, ' ', end='')# 默认结尾是换行的,变成不换行的只需要end=''即可
print()# 换行作用
# print(end='\n') 等价于 print()
3. python中常用数据类型
数字(number), 字符串(string), 列表(list), 元组(tuple),字典(dict), 集合(set)
列表(list)
python中的列表和c中数组很像, 不同的地方是他可以存储不同的数据类型
创建第一个列表
list1 = [1, 2, '张三', '李四']
print(type(list1))#
print(list1)
遍历列表,把元素一个一个取出来
for 临时变量 in 可迭代对象
for x in list1:
print(x)
列表的增删改查
- 增加操作
skill_list = []
for i in range(1, 5):
skill = '技能' + str(i)# 将数字转化成string类型
# 向列表的末尾添加元素
skill_list.append(skill)
print(skill_list)
- 查询
# 访问 使用索引进行访问
# 访问skill_list的第二个元素
print(skill_list[1])
# 创建一个[0, 1, 2, ...10]的列表
a = []
for i in range(0,11):
a.append(i)
print(a)
# 判断a列表中是否有9这个数字
if 9 in a:
print('9在a中')
- 删除
# 删除技能2
# del 要删除的列表名[索引]
del skill_list[1]
print('删除后', skill_list)
- 修改
# 修改 skill_list最后一个元素的为 垂直打击
skill_list[2] = '垂直打击'
print('修改后', skill_list)
元祖(tuple)
和列表非常相似,只不过不能修改
# 创建元祖 () 表示元祖
a = (1, 2, 'lisi')
print(type(a)) #
# 尝试修改元祖
# print(a[0])
# a[0] = 22
元祖既然不能修改,还很列表很相似,要他何用?
元祖的优点:
- 元祖的速度要快于列表
- 不能修改,可以带来"写保护",安全
- 元祖可以常备作为字典的键使用
b = () # 创建空元祖
print(type(b)) #
c = (22)
print(type(b))
print(type(c)) #
c = ('55',) # 单元素的元祖要有逗号
print(type(c)) #
字符串(string)
字符串创建 可以使用单引号也可以使用双引号
涉及到引号的嵌套时可采用外层单引号,里层双引号的方式,相反也可
str1 = 'neuedu'
str2 = "欢迎来到英雄联盟"
str3 = '你知道今天是"22"号吗'
print(str1)
print(str2)
print(str3)
len()内置函数
# 用于检测容器内元素的个数
print(len(str1))
*操作
print(str1*3) # neueduneueduneuedu
# print(str1+3)
print(str1+str(3)) # neuedu3
print(str1+'3') # neuedu3
字符串的格式化输出 最流行的是format函数输出
语法格式
'{}字符串{}'.format(变量1, 变量2)
案例
hero = '鲁班七号'
grade = 13
print('您当前使用的英雄是{},等级为{}'.format(hero, grade))
# 您当前使用的英雄是鲁班七号,等级为13
- 字符串的常用操作
- replace() 替换
price = '¥998'
price = price.replace('¥', '') # 替换完要重新赋值给price
print(price) # 998
- strip() 去两端空格 后端常用
name = ' life is short, use python '
print(len(name)) # 29
name = name. strip()
print('去空格之后', len(name)) # 去空格之后 25
- join() 主要应用于把列表变成字符串
# str_intro = " "
# str_intro = "_"
# str_intro = "/"
# str_intro = "\\"
li = ['I', 'Love', '王者荣耀']
# 把 li 变成字符串
# str4 = str_intro.join(li)
# print(str4) # C:\User\pyCode
print(" ".join(li)) # I Love 王者荣耀
字典(dict)
使用{}创建字典, 字典中的每一个元素都以键值对的形式存在,中间用冒号隔开
创建字典
stu_info = {'name': '刘强东', 'addr': '北京海淀区', 'age': 18}
字典的访问,通过键访问值
print(stu_info['name']) # 刘强东
# 解决访问键不存在时报错的情况
# 当字典中存在这个键的时候,就正常返回该值
# 当字典中不存在该键的时候,返回none值,并且可以设置默认返回值
print(stu_info.get('sex', 'female'))
字典的修改,访问键然后赋值
stu_info['age'] = 50
print('修改之后的值', stu_info) # 修改之后的值 {'name': '刘强东', 'addr': '北京海淀区', 'age': 50}
# 增加 当字典中不存在这个键的时候,就是相当于往字典里添加了元素
stu_info['sex'] = 'female'
print('增加后', stu_info) # 增加后 {'name': '刘强东', 'addr': '北京海淀区', 'age': 50, 'sex': 'female'}
删除
# del 字典['键']
del stu_info['sex']
print('删除后', stu_info)
- 字典常用操作
# 返回字典所有的键 k
print(stu_info.keys())
# 返回字典中所有的值 v
print(stu_info.values())
# 返回所有的键值对
# 返回形式是列表,列表中的每一个元素都是一个元祖
print(stu_info.items()) # dict_items([('name', '刘强东'), ('addr', '北京海淀区'), ('age', 18)])
stu_info_list = stu_info.items()
# 转化成字典
print(dict(stu_info_list)) # {'name': '刘强东', 'addr': '北京海淀区', 'age': 18}
# 字典的遍历输出
for k,v in stu_info.items():
print(k, ':', v)
'''name : 刘强东
addr : 北京海淀区
age : 18'''
集合(set)
可以用于去重
也使用{}表示,只不过{}中没有元素时代表的是空字典
特点:无序,不重复
set1 = {'zhangsan', 123, 666}
print(type(set1)) #
# 集合的遍历
for x in set1:
print(x)
小结:python中常用数据类型:字符串, 数字, 列表[],元祖(), 字典{:,:}, 集合{}
4. 中文分词
英文单词由于单词之间是有空格的,所以不需要分词,中文则不同
这就需要我们使用第三方库来进行分割
jieba结巴分词是目前最流行的中文分词库
安装jieba分词
pip install jieba
导入jieba
import jieba
- 目前导入模块的方式有两种
- import 模块名字
import turtle
import jieba
- from 模块 import 对象或者函数(你需要的就导入,不需要就不用导入,可以同时导入多个)
from random import randint, random
# 等价于
# import random
# random.randint()
- 结巴分词的特点,支持三种模式
- 精确模式 将字符串分割成等量的中文 最常用的模式
seg = '我来到北京清华大学'
seg_list = jieba.lcut(seg)
print(seg_list) # ['我', '来到', '北京', '清华大学']
- 全模式
# cut_all 参数用来控制是否采用全模式
# 将字符串中所有的分词结果都列举出来,
# 特点,全, 缺点,冗余性大
seg_list1 = jieba.lcut(seg, cut_all=True)
print(seg_list1) # ['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
- 搜索引擎模式
# 首先执行精确模式,然后对其中的长词进一步切分得到的结果
# 该模式更倾向于寻找短词语,这种方式具有一定的冗余度,但是比全模式要少
seg_list2 = jieba.lcut_for_search('小明硕士毕业于中国科学技术大学,后在日本京都大学深造')
print(seg_list2) # ['小明', '硕士', '毕业', '于', '中国', '科学', '技术', '科学技术', '大学', ',', '后', '在', '日本', '京都', '大学', '日本京都大学', '深造']
seg_list3 = jieba.lcut('小明硕士毕业于中国科学技术大学,后在日本京都大学深造', cut_all=True)
print(seg_list3) # ['小', '明', '硕士', '毕业', '于', '中国', '科学', '科学技术', '技术', '大学', '', '', '后', '在', '日本', '日本京都大学', '京都', '京都大学', '大学', '深造']
- 总结:如何选择模式:
- 如果希望对文本词分词准确,不产生冗余 ---> 精确模式
- 如果希望对文本词分词更为准确,不漏掉任何分词的可能---> 全模式
- 如果没想好怎么用,可以使用搜索引擎模式