初识python(上)(基于苏州大学慕课网)

初识python(上)

1概述

简介

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

  • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
  • Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。
  • Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
  • Python 是初学者的语言: Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW浏览器再到游戏。

CPython是Python的官方版本,使用C语言实现,使用最为广泛。CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。

PyPy:Python的Python实现版本,原理是这样的,PyPy运行在CPython(或者其它实现)之上,用户程序运行在PyPy之上。

发展简史

起源:20世纪末期,荷兰人吉多·范罗苏姆(uido van Rossum),起源于ABC语言
发布:第一版公开发行于1991年

特点

简单、易学、上手速度快
免费、开源
可移植性
面向对象
可拓展性
丰富的库

一个实例

将一个不确定位数的数字的各个位数上的数字保存在数组中。

Num = int(input('请输入正整数:'))
res = [int(c) for c in str(Num)]
print(res)`

基本数据类型

数字

整型(int) 2.X中区分int和long,但在3.X中不再区分
布尔型(bool)
浮点型(float) 占据24个字节
复数型(complex) a+bi
字符串(str) 不可变数据类型(改变一个元素需要新建一个新的字符串),使用单、双、三引号作为字符串的标示,python没有字符(char)这一数据类型

序列(连续内存空间)
  • 可变与不可变特性
    • 可变 :列表、字典、集合
    • 不可变:元组
  • 有序与无序特性
    • 有序:列表、元组、字典
    • 无序:集合

Tips:
①上述序列结构并不一定要求所有元素都是相同类型的;
②可以利用集合来完成去重处理;
③可以利用字典的哈希特性来完成大数据量的查找和统计的速度;

(不)可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不(也会)发生改变。

练习题

1.离开了集成开发环境,Python就无法解释和运行程序。(×)
2.C语言能实现的功能,用Python语言也能实现。(√)
3.在Python中,对于一个含有两个元素的元组(tuple)变量,可通过增加元素的操作使其成为含有三个元素的元组。(×)
4.在Python中,定义变量x=3,执行语句x+=2后,变量x的内存地址不会变。(×)
5.Python中字典类型的变量不能用于布尔测试。(×)

2顺序和分支程序应用

找零和简单贪心算法(顺序程序)

贪心法

在对问题求解时,总是做出当前最好的选择
具体思路: 根据局部最优原则,把待求解问题分成若干个子问题;对每一个子问题求解,得到子问题的解;把子问题的局部最优解合并得到整个问题的解。
缺陷: 步步最优不一定是全局最优。

找零钱的贪心处理过程
  • 找零钱66美分,有4种硬币,可以分解成4个子问题

    • 计算出最多使用几个25美分,得到剩余的金额
    • 计算出最多使用几个10美分,得到剩余的金额
    • 计算出最多使用几个5美分,得到剩余的金额
    • 计算出最多使用几个1美分,得到剩余的金额
    • 合并上述4步的结果得到问题的解
  • 上述四个子问题的先后顺序不可错位

简单写法

money = 66
quaters = money // 25 #子问题1,注意整除为双斜杠
money = money % 25

dimes = money // 10 #子问题2
money = money % 10

nickles = money //5 #子问题3
pennys = money % 5 #子问题4

循环实现

money = int(input("请输入找零金额(1-99):"))
coins = (25,10,5,1)
counts = []
for coin in coins:
	counts.append(money//coin)
	money %= coin
for i in range(len(counts)):
	print("找零{0}美分硬币{1}个".format(coins[i],counts[i]))

分支程序1

求身高体重
tz = float(input("体重(kg)="))
sg = float(input("身高(m)="))
bmi = tz/sg/sg
print("BMI = %.1f" % bmi)
if bmi < 18.5:
	print("体重偏轻")
elif bmi < 23.0:
	print("正常")
elif bmi < 25.0:
	print("超重")
elif bmi < 29.0:
	print("轻度肥胖")
else:
	print("肥胖")

分支程序2

判断日期合法性
year = int(input("年份 = "))
month = int(input("月份 = "))
day = int(input("日期 = "))
leap = False
legal = False
month1 = {1,3,5,7,8,10,12}
month2 = {4,6,9,11}
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0 :
	leap = True
if month in month1:
	if 1 <= day <= 31:
		legal = True
elif month in month2:
	if 1 <= day <= 30:
		legal = True
elif month == 2:
	if not leap and 1 <=day<= 28:
		legal = True
	elif leap and 1<=day<=29:
		legal = True
print("%d年%d月%d日是%s" % (year,month,day,"合法日期" if legal else "不合法日期"))

年份输入方式的改进方法

date = input("日期 = ")
year, month, day = (int(x) for x in tuple(date,split("-")))

练习题

1.Python中浮点数也可以执行求余运算。(√)
2.在Python 3.X版本中,运行语句c = a / b (假设a, b是已经赋值过的整数变量,且b的值不为0),则:若a能整除b,c就是整型变量;反之,若a不能整除b,c为浮点型变量。(×,都为浮点型)
3.要将3.1415926变成00003.14,如何进行格式化输出。("%08.2f"% 3.1415926)
4.Python中逻辑与的关键字。(and)
5.如果一句Python代码过长,可在行末写下符号"/",然后换行继续写。(×,符"\")
6.运行下列Python程序,程序会输出1,同时也会输出关于b未定义的报错信息。(×,不进入else语句不会报错)

a = 2
if a>1:
    print(1)
else:
    print(b)

7.在Python中,bool([0])的值为False。(×,True)
8.input函数的返回值是字符串,如果需要转换为其余类型,需要自行转换。(√)

3循环程序与应用

猜数字与二分法

import random
result = random.randint(1,10000)
guess = 0
count = 0

while guess != result :
	guess = int(input("请输入您猜的数字(1-10000):")
 	count += 1
 	if guess > result :
 		print("您猜的数字偏大了")
 	elif guess < result:
 		print("您猜的数字偏小了")
 print("恭喜您猜对了,合计猜了{0}次".format(count))

X年X月X日是星期几

import datetime
anyday = datetime.datetime(2019,7,17).weekday()+1
anyday = int(datetime.datetime(2019,7,17).strftime("%w")) #字符串形式周天数

九九乘法表

for i in range(1, 10):
    for j in range(1, i+1):
            print("%d*%d=%d\t" % (j, i, i*j), end=" ")
    print("")
print("")

百钱百鸡及代码优化(穷举法)

题目:公鸡5块钱一只,母鸡3块钱一只,小鸡三只一块钱,有一百块钱买了一百只鸡,问各买了多少只?

1(1030301)
for cock in range(0,101):
	for hen in range(0,101):
		for chick in range(0,101):
			if cock*5+hen*3+chick//3==100 and cock+hen+chick==100 and chick%3==0
				print("公鸡{0:2d} 母鸡{1:2d} 小鸡{2:2d}".format(cock,hen,chick))
2(24276)
for cock in range(0,21):
	for hen in range(0,34):
		for chick in range(0,101,3):
			if cock*5+hen*3+chick//3==100 and cock+hen+chick==100
				print("公鸡{0:2d} 母鸡{1:2d} 小鸡{2:2d}".format(cock,hen,chick))
3(714)
for cock in range(0,21):
	for hen in range(0,34):
		chick = 100 - cock - hen
			if cock*5+hen*3+chick//3==100 and chick%3==0
				print("公鸡{0:2d} 母鸡{1:2d} 小鸡{2:2d}".format(cock,hen,chick))
穷举法

练习题

1.如果while循环的循环条件是整型常量,那么就构成死循环。(×)
2.range函数(只有一个参数时设为stop)
range(start,stop[,step])
计数从start开始(默认0),到stop结束(不包括stop),每次计数加step(默认为1)
3.do不是 Python 语言保留字。(√)
4.x==0 等价于 not x。(√)
5.如下程序用于判断一个用户输入的正整数是否是素数,其中第8行的下划线出应该是_______.

import math
num=int(input("请输入一个数:"))
top=int(math.sqrt(num))
i=2
while i<=top:
    if num%i==0:break     #修改素数标志
    i=i+1
if i==______ and num>1:
    print(num,"是素数。")
else:
    print(num,"不是素数。")

答:i==top+1(一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n)。据此,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。)

4数据类型和应用

统计字符的使用频率

1读取文件内容
f = open("test.txt","rt")
data = f.readlines()
f.close()
2统计字母频度
dic = dict()  #字典初始化
for line in data:
	line = line.upper() #不区分大小写
	for c in line:
		if "A" <= c <= "Z":
			dic[c] = dic.get(c,0) + 1 #get(c,0),第一个参数为键,第二个参数是若该键不存在则以0作为代替
3字典元素按键进行排序输出
i = 0
for k in sorted(dic): #sorted排序函数,默认对键进行排序
	print("%S:%d\t" % (k,dic[k]),end="")
	i+=1
	if i % 4 ==0: #每行输出4个
	print("")

按值排序则sorted(dic,key = dic._getitem_,reverse = True)

sorted 语法:
sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:

  • iterable – 可迭代对象。
  • cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)

正则表达式

正则表达式的基础:元字符

  • 适配符
  • 数量定义符
  • 边界定义符
  • 成组定义符

1.利用正则表达式提取188开头的电话号码

import re
pa = re.compile('188\d{8}')
res = pa.findall('''cadcdacdscsdcsdcsd 18812314567 jodjfdwjfiuwefwjfjdnjfwefu fwefnweufj fwejifwejifwe fwejifjwei 218812311887 jdjfiefje 13861322188ss sod dsji day when a freind 18812311887 jkdjisfdnjjkdn cdje 188123456a ride in his own small phane.''')
print(res)

2.在下面一段文本种找出所有固定电话号码,并要求得到每个电话号码的区号、市话,以及各段号码在原始文本中的起止位置。

Suppose my phone number is 0512-65118888,
yours is 010-67676868, his is 0581-7877777.
import re
telNumber="Suppose my phone number is 0512-65118888, yours is 010-67676868, his is 0581-7877777."
pa = re.compile('(\d{3,4})-(\d{7,8})')
res = pa.findall(telNumber)
print(res)

inx = 0
while True:
	res = pa.search(telNumber,inx)
	if not res:
		break
	for i in range(3):
		print(res.group(i)," ",res.start(i)," ",res.end(i))
	inx = res.end(2)

列表与复杂排序

sorted函数实例(利用lambda确定排序关键词)

students = [
	('john','A',18),
	('jane','B',19),
	('dave','B',17),
	]
sorted(students, key = lambda s : s[2]) #根据年龄排序
sorted(students, key = lambda s : s[0]) #根据名字排序
#具有相同关键字的元素在排序后相对顺序不变(稳定排序)

在这里插入图片描述
若按照多种条件排序(有主次顺序)则可以多次调用排序方法(按照主次顺序倒序设定排序关键字)。

练习题

1.Python 3 解释器执行 for x in {‘a’:‘b’, ‘c’:‘d’}: print(x)的结果是什么。(a c)
2.现有dict1={‘a’:2,‘b’:3,‘c’:4},那么len(dict1)的值是什么。(3)
3.已知 dict1={1:2},那么执行dict1[2]=3之后dict1的内容是什么。({1:2,2:3})
4.字典的键可以是字符串常量也可以是整型常量,甚至还可以是列表。(×,列表不可以)
5.字典的键必须唯一,而值可以不唯一。(√)
6.使用正则表达式之前必须先用re的compile方法编译。(×)
7.正则表达式’\d{5}'可用来检查字符串是否为5个数字字符组成的字符串。(×)
8.sort与sorted的区别
sort(L)直接改变L内元素的顺序,返回值为None
sorted(L)不改变L内元素的顺序,返回排序后的列表
9.对Python的字典的key使用二分检索,将会加快字典获取对应项的速度。(×)
10.已知列表x = [1, 2],那么执行语句 x.extend([3])之后,x的值为[1, 2, 3]。(√)
11.表达式[3] in [1, 2, 3, 4]的值为True。(×)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值