[Python3]函数的一些练习

练习之我的答案,有不对的地方欢迎指正

1.编码问题

请说明python2 与python3中的默认编码是什么?
py2 是ASCII   py3 是 utf-8

为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?
编码设置出问题了。
Python解释器的默认编码
Python源文件文件编码
Terminal使用的编码
操作系统的语言设置

如何进行编码转换?
先decode解码到Unicode 然后再从Unicode  encode编码

#-*-coding:utf-8-*- 的作用是什么?
声明python的编码类型

解释py2 bytes vs py3 bytes的区别
py2的bytes等同于str   字符串解码后会变成unicode
py3的bytes就是单纯的二进制,str就是unicode格式的字符

2.文件处理

r和rb的区别是什么?
rb是指二进制模式,数据读到内存里直接是bytes格式,想要内容还需要手动decode解码,因此在打开文件阶段,不需要制定编码
r是从文件读取数据

解释一下以下三个参数的分别作用
 open(f_name,'r',encoding="utf-8")
 f_name     打开的文件名
 r             只读模式
 encoding="utf-8"    表示设置的编码格式,会按utf-8的规则去断句解码

写函数,计算传入数字参数的和。(动态传参)
def sum_num(x,y):
    return x + y
print(sum_num(2,3))

写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
import os
f_name = 'test.txt'
f_new_name = 'new_test.txt'

old_str = '一二三四'
new_str = '一三五'

f = open(f_name, 'r', encoding='utf-8')
f_new = open(f_new_name, 'w', encoding='utf-8')

for line in f:
    if old_str in line:
        new_line = line.replace(old_str, new_str)
    else:
        new_line = line
    f_new.write(new_line)

f.close()
f_new.close()
os.replace(f_new_name, f_name)


写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
def judge(args):
    rel = True
    print(args)
    for a in args:
        if ' ' in a:
            rel = False
            break
    return rel
li = ['12 3', 'sde', '2323']
tu = ('123 3', 'ad a', '23 1a')
b = judge(li)
if b:
    print('没有空格')
else:
    print('有空格')

写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def trans_list(args):
    dic = {}
    for k, v in args.items():
        if len(v) > 2:
            dic[k] = v[0:2]
        else:
            dic[k] = v
    return dic

dic1 = {"k1": "v1v1", "k2": [11,22,33,44]}

a = trans_list(dic1)
print(a)

解释闭包的概念
函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。这些内部函数可以访问他们所在的外部函数中声明的所有局部变量和参数。当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包。内部函数会在外部函数返回后被执行,当这个内部函数执行时,它仍然可以访问其外部函数的局部变量、参数以及其他内部函数。

闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,有限使用自己外层包裹的作用域。


函数进阶:

写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]
def poke():
    num = []
    for i in range(2, 11):
        num.append(i)
    num.extend(['A', 'J', 'Q', 'K'])
    poke_type = ['黑桃', '红桃', '草花', '方片']
    poke_list = []
    for i in poke_type:
        for j in num:
            poke_list.append((i, j))
    return poke_list
print(poke())

写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

例如:min_max(2,5,7,8,4)
返回:{‘max’:8,’min’:2}
def min_max(*args):
    dic = {}
    dic['min'] = min(args)
    dic['max'] = max(args)
    return dic
print(min_max(2,5,7,8,4))

写函数,专门计算图形的面积

其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
调用函数area(‘圆形’,圆半径) 返回圆的面积
调用函数area(‘正方形’,边长) 返回正方形的面积
调用函数area(‘长方形’,长,宽) 返回长方形的面积
def area():
    def 计算长方形面积():
        pass

    def 计算正方形面积():
        pass

    def 计算圆形面积():
        pass

import math

def area(name, *args):
    def area_rectangle(x, y):
        return ("长方形的面积为:", x*y)
    def area_square(x):
        return ("正方形的面积为:", x**2)
    def area_round(r):
        return ("圆形的面积为:", math.pi*r*r)
    if name == '长方形':
        return area_rectangle(*args)
    elif name == '正方形':
        return area_square(*args)
    elif name == '圆形':
        return area_round(*args)

print(area('长方形', 2, 3))
print(area('正方形', 3))
print(area('圆形', 6))


写函数,传入一个参数n,返回n的阶乘

例如:cal(7)
计算7*6*5*4*3*2*1
def cal(args):
    s = 1
    for i in range(1, args + 1):
        s *= i
    return s

print(cal(5))


编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码


生成器和迭代器的区别?
generator生成器 如果函数定义中包含yield关键字,那么这个函数就是一个生成器。
生成器一定是迭代器,迭代器不一定是生成器。迭代器一定是迭代对象,迭代对象不一定是迭代器
可迭代对象,可以使用for...in...语句进行循环的对象,比如字符串,列表,元组,字典以及迭代器,生成器都是可迭代对象。
迭代器是可以使用next()进行回调对象,可迭代对象和迭代器的联系:可以对迭代对象使用iter()方法来生成迭代器。
一个知乎大神些的关于迭代器生成器的总结。https://www.zhihu.com/question/20829330

生成器有几种方式获取value?
2种 for循环    next获取

r   文本只读模式
rb  二进制模式 这种方法是用来传输或存储,不给人看的
r+  读写模式,只要有r,那么文件必须存在
rb+ 二进制读写模式
w   只写模式,不能读,用w模式打开一个已经存在的文件,如果有内容会清空,重新写
wb  以二进制方式打开,只能写文件,如果不存在,则创建
w+  读写模式,先读后写,只要有w,会清空原来的文件内容
wb+ 二进制写读模式
a   追加模式,也能写,在文件的末尾添加内容
ab  二进制追加模式
a+  追加模式,如果文件不存在,则创建文件,如果存在,则在末尾追加
ab+ 追读写二进制模式,从文件顶部读取文件,从文件底部添加内容,不存在则创建

用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb

name=['alex','wupeiqi','yuanhao','nezha']
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把
函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
name=['alex','wupeiqi','yuanhao','nezha']

def change(x):
    return x+'_sb'

li = map(change, name)
print(list(li))


用filter函数处理数字列表,将列表中所有的偶数筛选出来
num = [1,3,5,6,7,8]
def func(x):
    if x%2 == 0:
        return True
ret = filter(func, num)
print(list(ret))

每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
计算购买每支股票的总价
用filter过滤出,单价大于100的股票有哪些
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
for i in portfolio:
    print("用户{}购买股票总价{}".format(i['name'], i['shares']*i['price']))

f = filter(lambda d:d['price']>=100,portfolio)
print(list(f))

有如下程序, 请给出两次调用show_num函数的执行结果,并说明为什么:
num = 20
def show_num(x=num):
    print(x)
show_num()
num = 30
show_num()

20
20


有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母;
li = ['alex', 'egon', 'smith', 'pizza', 'alen']
for i in range(len(li)):
    if li[i][0] == 'a':
        li[i] = li[i].capitalize()
    else:
        continue
print(li)

有名为poetry.txt的文件,其内容如下,请删除第三行;

  昔人已乘黄鹤去,此地空余黄鹤楼。
  黄鹤一去不复返,白云千载空悠悠。
  晴川历历汉阳树,芳草萋萋鹦鹉洲。
  日暮乡关何处是?烟波江上使人愁。

 with open('poetry.txt', 'r+', encoding='utf-8') as f:
    data = f.read()
    data_list = data.split('\n')
    data_list.pop(2)
    s = '\n'.join(data_list)
    f.write(s)
    print(s)

有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在;
with open('username.txt', 'r+', encoding='utf-8') as f:
    data = f.read()
    if 'alex' in data:
        print('user is already exist')
    else:
        f.write('\nalex')
        print('已添加alex')

有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行;
import os
a = 'user_info.txt'
b = 'user_info1.txt'
with open(a,'r',encoding='utf-8') as f:
  with open(b, 'w', encoding='utf-8') as f2:
      for i in f:
          if '100003' in i:
              pass
          else:
              f2.write(i)
os.replace(b,a)


写一个计算每个程序执行时间的装饰器;
import time
def timer(func):
    def inner():
        start_time = time.time()
        func()
        stop_time = time.time()
        print(stop_time - start_time)
    return inner
@timer
def sayhi():
    print('hello')
sayhi()


lambda是什么?请说说你曾在什么场景下使用lambda?
lambda函数就是可以接受任意多个参数(包括可选参数)并且返回单个表达式值得函数
    好处:
        1.lambda函数比较轻便,即用即扔,适合完成只在一处使用的简单功能
        2.匿名函数,一般用来给filter,map这样的函数式编程服务
        3.作为回调函数,传递给某些应用,比如消息处理

题目:写一个摇骰子游戏,要求用户压大小,赔率一赔一。

要求:三个骰子,摇大小,每次打印摇骰子数。
import random
def roll_dice():
    print('--开始摇骰子--')
    data = {}
    for i in range(1, 4):
        point = random.randrange(1, 7)
        data[i] = point

    return data


def roll_result(data):
    print('您的骰子结果:{} {} {}'.format(data[1], data[2], data[3]))
    if sum(data.values()) >= 10:
        return '大'
    else:
        return '小'


def start_game():
    print('--欢迎来到澳门大赌场--')
    money = 1000
    while money > 0:
        print('当前金额{}'.format(money))
        choice = ['大', '小']
        your_choice = input('请输入大或者小:')
        your_money = input('请输入下注金额:')
        if not your_money.isdigit():
            print('输入有误请重新输入')
            continue
        if your_choice in choice:
            point_data = roll_dice()
            res = roll_result(point_data)
            if your_choice == res:
                print('您赢了')
                money += int(your_money) * 2
            else:
                print('您猜错了')
                money -= int(your_money)
        else:
            print('输入有误,请重新输入。')
    else:
        print('game over')


start_game()
 

猜你喜欢

转载自blog.csdn.net/TynMhxx/article/details/81516805
今日推荐