Day-05

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’)

函数练习

“”"
*** 练习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)

动态添加成员

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)

函数的返回值

#函数调用时一般有返回值,没有定义返回值的时候,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):
    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值
d = dict(a=1,b=2)
print(*d)
getStuInfo('westos',11,**d)

函数练习——平方等式

“”" 题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 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)

函数的作用域

作用域
局部作用域
全局作用域

# 全局作用域:作用于整个程序
# 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)

函数练习02

 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 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)

函数练习03

编写函数,计算字符串匹配的准确率

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))

or

s1 = input('请输入第一句话:')
s2 = input('请输入第二句话:')
right = 0
for a,b in zip(s1,s2):
    if a == b:
        right += 1
print('匹配率为%.2f' %(right/len(s1)))

可变参数练习

** 案例1:
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.

def cacluate(num):
    avg = sum(num)/len(num)
    l = []
    for i in num:
        if i > avg:
            l.append(i)
    return avg,l
print(cacluate([4,5,6,7,8]))

在这里插入图片描述

**案例2: 编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’ 元组的第一个值为大写字母的个数,
第二个值为小写字母个数.

def receive(letter):
    if not isinstance(letter,str):
        print('cannot recognize')
        return
    else:
        big = 0
        small = 0
        for i in letter:
            if i.isupper():
                big+=1
            elif i.islower():
                small+=1
        return big,small
print(receive('hello SJZ'))
print(receive(123))

在这里插入图片描述

**案例3:
编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
- 将列对应(不包含k)表下标k之前的元素逆序;
- 将下标k之后的元素逆序;

import random
def fun(alist,k):
    if k<0 or k>len(alist):
        return "error key"
    else:
        newL1=alist[:k]
        newL2=newL1[::-1]
        newL3=alist[k:]
        newL4=newL3[::-1]
        return newL2+newL4
li=[]
for i in range(30):
    num=random.randint(1,100)
    li.append(num)
print(li)
a=fun(li,4)
print(a)

结果

/home/kiosk/anaconda3/envs/2048/bin/python /home/kiosk/PycharmProjects/2018.11.17/day05/17_可变参数练习05.py
[89, 6,78, 95, 11, 33, 54, 86, 69, 44, 18, 66, 35, 32, 41, 64, 71, 37, 30,74, 78, 23, 48, 26, 71, 8, 75, 45, 3, 11]
[95, 78, 6, 89, 11, 3, 45, 75, 8, 71, 26, 48, 23, 78, 74, 30, 37, 71, 64, 41, 32, 35, 66, 18, 44,69, 86, 54, 33, 11]
Process finished with exit code 0

函数练习04

模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
轮盘转的时候是随机的,
如果范围在[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)

综合练习

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值