python内置数据结构总结
数值
bool
str
list tuple set dict
可变数据类型 不可变数据类型
可变数据类型:list set dict(是否可以增删改查)
有序数据类型和无序数据类型
有序:str list tuple
无序:数值 bool set
python2:dict无序 python3中:dict有序
一般情况下:有序数据类型可以索引,切片,连接,重复 但是字典除外
可以for循环数据结构
函数的理解和定义
# print('hello')
# print(min(2,4))
# print(min())
"""
范例:
def print(self, *args, sep=' ', end='\n', file=None):
def min(*args, key=None):
def 函数名():
函数体
"""
# li = [1,2,3]
# li.copy()
# 定义一个函数
# 在没有调用函数的情况下,函数是不会被执行的
# def hello():
# print('hello')
# print('hello')
#
# # 调用函数
# # hello()
#
# # 函数里面嵌套函数
# def fentiao():
# print('is fentiao....')
# def westos():
# print('westos')
# #westos()
#
# fentiao()
def func1(a):
# name = 'westos'
# 定义函数时的变量称为形式参数,变量名可以任意起
print('hello %s' %(a))
# 调用函数时的参数称为实参,该参数必须是实际存在的
func1(12)
func1('linux')
func1('python')
函数动态添加成员
def fun():
print(fun.x)
fun()
# # 动态添加 ## 一直陷入死循环
fun.x = 3
fun()
# 动态删除
del fun.x
fun()
函数的返回值
# 函数调用时一般有返回值,没有定义返回值的时候,python中默认返回None
# def hello():
# print('hello')
#
# res = hello()
# print(res)
def hello():
# return 返回的表达式或者变量
return 'hello'
res = hello()
print(res)
return的应用
"""
随机生成20个学生的成绩
判断这个20个学生的等级
"""
import random
def get_level(score):
if 90 < score <= 100:
return 'A'
elif 80 < score <= 90:
return 'B'
else:
return 'C'
def main():
for i in range(20):
score = random.randint(1,100)
print('成绩为%s,等级为%s' %(score,get_level(score)))
main()
多个返回值
def fun(a):
# 接收一个列表,求这个列表的最大值,平均值,最小值
max_num = max(a)
min_num = min(a)
avg_num = sum(a)/len(a)
# python函数中,只能返回一个值
# 如果非要返回多个值,会把返回的值封装为一个元组数据类型
return max_num,min_num,avg_num
variables = fun([34,1,2,3,4,5,6,7,421])
print(variables,type(variables))
函数形参之四大参数类型
"""
参数:形参 实参
形参的分类:位置参数 默认参数 可变参数 关键字参数
"""
# 位置参数:形参和实参必须保持一致
def getInfo(name, age): # 按照位置传递参数
print(name, age)
getInfo(age=18, name='name') # 位置可以不同,但必须要给形参赋值
# 默认参数:形参和实参可以不一致
def mypow(x,y=2):
"""
求x的y次方
:param x:
:param y:
:return:
"""
print(x**y)
mypow(4)
mypow(4,3)
# 可变参数
def mySum(*args):
"""
需求:用户可以传递任意的值,计算数值的和
*args:是一个可变参数
args:是元组数据类型
:param args:
:return:
"""
#print(args)
sum = 0
for item in args:
sum += item
print(sum)
mySum(1,2,3,4,5,6,7,8)
# 关键字参数
def getStuInfo(name,age,**kwargs): ##kwargs表示的是字典类型参数
print(name,age)
print(kwargs)
getStuInfo('westos',11,hobbies=['code','running'],gender='female')
# nums = [1,2,3,4,5,6]
# nums1 = (2,5,6,7,9,10)
# nums2 ={1,2,3,4,5,6,7,8}
# mySum(*nums2) ##*表示对列表,元组,集合进行解包,将所包含的数据一个一个输入到函数中
# score = (12,23,56,78,90)
# minscore,*middlescore,maxscore = score
# print(*middlescore)
# print(middlescore)
# 如果要对字典进行解包,一个星号:获取key值,两个星号:获取key-value值
d = dict(a=1,b=2)
print(*d)
getStuInfo('westos',11,**d)
函数的作用域
"""
作用域
局部作用域
全局作用域
"""
# 全局作用域:作用于整个程序
# num = 10
# print('out fun: id=',id(num))
#
# def fun():
# #局部作用域,在函数运行时生效,函数运行结束则释放
# num =2
# print('in fun:id=',id(num))
# print('in fun:num = %s' %(num))
#
#
# fun()
# print('out fun: num=%s' %(num))
num = 10
def fun():
# 通过global关键字声明局部变量为全局变量
# 函数执行完毕,变量依然生效
global num
num = 2
fun()
print(num)
参数检测
def add(x, y):
if isinstance(x, (int, float)) and isinstance(y, (int, float)):
return x + y
else:
print('Error:')
res = add(2.5,2)
print(res)
函数练习
"""
# *** 练习1:
# 编写一个名为collatz()的函数,它有一个名为number的参数。
# 如果参数是偶数,那么collatz()就打印出number//2
# 如果number是奇数,collatz()就打印3*number+1
"""
def collatz(number):
# if number % 2 == 0:
# print(number//2)
# else:
# print(3*number+1)
print(number//2 if number %2 ==0 else 3 * number +1)
collatz(2)
"""
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 1**2 + 3**2 = 10
f(207) = 2**2 + 0**2 + 7**2 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=10**18, a<=b;
输出:
输出对应的答案;
范例:
输入: 51 5000 10000
输出: 3
"""
def f(n):
# 1.先把数字转换成为字符串
n = str(n)
# 2.计算字符串中每个数的平方
sum = 0
for item in n:
sum += int(item)**2
return sum
def isOK(k,n):
if k * f(n) == n:
return True
else:
return False
def main():
k = 51
a = 5000
b = 10000
count = 0
for i in range(a,b+1):
if isOK(k,i):
count += 1
print(count)
main()
# print(f(13))
# print(f(207))
#
# # 1.接收变量k,a,b
# s = input('请输入(k,a,b):') # '51 5000 10000'
# # 存储整型k,a,b
# li= []
# """
# st = 'hello python hellp world'
# print st.split()
# ['hello', 'python', 'hellp', 'world']
# """
# for item in s.split():
# li.append(int(item))
# k,a,b=li
#
# # 2.进行判断是否满足条件
# count = 0
# for i in range(a,b+1):
# if k*f(i) == i:
# count +=1
# print(count)
"""
1.Collatz序列
编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2,并返回
该值。如果number是奇数,collatz()就打印并返回3*number+1。
然后编写一个程序,让用户输入一个整数,并不断对这个数
调用collatz(),直到函数返回值1(令人惊奇的是,这个序列
对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学
家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
- 输入:
3
- 输出:
10
5
16
8
4
2
1
"""
def collatz(number):
if number == 1:
exit(0)
elif number % 2 == 0:
return number // 2
else:
return 3 * number + 1
num = int(input('Num:'))
while True:
num = collatz(num)
print(num)
"""
编写函数,计算字符串匹配的准确率
"""
def Rate(orgin,userInput):
if not (isinstance(orgin,str) and isinstance(userInput,str)):
print('The tow parameters must be string')
return
if len(orgin) < len(userInput):
print('Sorry.')
return
right = 0
for orgin_char,user_char in zip(orgin,userInput):
if orgin_char == user_char:
right += 1
return right/len(orgin)
a = 'have a nice day'
b = 'Have b aaaa Day'
print(Rate(a,b))
"""
:模拟轮盘抽奖游戏
# 轮盘分为三部分: 一等奖, 二等奖和三等奖;
# 轮盘转的时候是随机的,
# 如果范围在[0,0.08)之间,代表一等奖,
# 如果范围在[0.08,0.3)之间,代表2等奖,
# 如果范围在[0, 1.0)之间,代表3等奖,
# 模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
"""
import random
rewardDict = {
'一等奖': (0, 0.08),
'二等奖': (0.08, 0.3),
'三等奖': (0.3, 1),
}
def rewardFun():
"""用户得奖等级"""
# 生成一个0~1之间的随机数
number = random.random()
# 判断随机转盘转的数是几等奖?
for k, v in rewardDict.items():
# 这里的v是元组
if v[0] <= number < v[1]:
return k
# print(rewardFun())
resultDict = {}
for i in range(1000):
# res: 本次转盘的等级(一等/二等/三等)
res = rewardFun()
if res not in resultDict:
resultDict[res] = 1
else:
resultDict[res] = resultDict[res] + 1
for k, v in resultDict.items():
print(k, '---->', v)
"""
**案例1:
编写一个函数, 接收字符串参数, 返回一个元组,'ehllo WROLD'
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
** 案例2:
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
**案例3:
编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
- 将列对应(不包含k)表下标k之前的元素逆序;
- 将下标k之后的元素逆序;
"""
def q(x):
if isinstance(x,str):
n=0
m=0
for i in x:
if i.islower():
n+=1
elif i.isupper():
m+=1
return m,n
else:
return '请正确输入'
print(q('AAAA bbbbss'))
def cacluate(*num):
sum=0
for i in num:
sum += i
avg=sum/len(num)
li=[]
for t in num:
if t>avg:
li.append(t)
return avg,li
a = cacluate(13,14,15,16)
print(a)
def fun(alist, k):
if k < 0 or k > len(alist):
return 'error key'
return alist[:k][::-1] + alist[k:][::-1]
a=[12,11,14,17,1,23,4,5,6]
k=6
print(fun(a,k))