# 1.计算1-300之间所有能被3和7整除的所有数之和
# num = 0
# for i in range(1,300):
#     if i%3 ==0 and i%7 ==0:
#         num += i
# print(num)
##############################################################################################################
# 2. 定义函数统计一个字符串中大写字母, 小写字母, 数字的个数, 并返回结果
# def cal(anystr): #定义函数的接收值
#     big_write = 0  #大写初始值为0
#     small_write = 0 #小写初始值为0
#     num = 0           #数字初始值为0
#     for i in anystr:  #遍历循环i
#         if i.isupper(): #判断大写方法
#             big_write +=1 #计数并加1
#         if i.islower(): #判断小写方法
#             small_write +=1 #计数并加1
#         if i.isdigit(): #判断数字方法
#             num +=1 #计数并加1
#         #else:
#          #   print('抱歉,我不认识')
#         #return
#     print('大写的字母是:%s 个'%big_write)    #输出
#     print('小写的字母是:%s 个' %small_write) #输出
#     print('数字是:%s 个' %num)                #输出
# cal(input())  #input()本身会被python转换为字符串,所有可以输入
# #为什么不能再for循环后面加else和return?
# #当是小写或数字的时候,依然会遍历,遍历的值传给了else,所以直接执行了return
##############################################################################################################
# 3.获取两个列表 i1=[11,22,33],i2=[22,33,44]中相同的元素集合
# i1 = [11,22,33]#创建列表i1
# i2 = [22,33,44]#创建列表i2
# set_i1 = set(i1)#创建集合set_i1
# set_i2 = set(i2)#创建集合set_i2
# set_i1_i2 = set_i1&set_i2# & 求交集
# print(set_i1_i2)
##############################################################################################################
# 4.将字符串 "老男人" 转换成utf-8编码的字节类型
# str1 = '老男人'
# str2 = str1.encode(encoding='UTF-8')
# print(str2)
##############################################################################################################
# 5.如何计算数字绝对值
# num = -15647615 #创建数字类型
# num_abs = abs(num) #abs方法转换为绝对值
# print(num_abs) #输出
##############################################################################################################
# 6.简述深浅拷贝原理
# 浅拷贝:针对简单的数据类型可以进行浅拷贝,因为浅拷贝指copy数据类型的第一层,公用原copy的数据的内存地址,
# 对于复杂的数据类型,如嵌套等不适合用
# 深拷贝:完全复制一套全新的数据(同时赋予新数据新的内存地址)
##############################################################################################################
# 7.举例布尔值为False的值
# 数字类型为0、数据类型判断为空、None的布尔值都是False
##############################################################################################################
# 8.内置函数all和any的区别
# 内置函数:all():
"""
    Return True if bool(x) is True for any x in the iterable.
    如果传入的可迭代对象的任何值为真,则返回值为真;如果为空则为假【每个值都为真才为真】
    If the iterable is empty, return False.
    """
# 内置函数:any():
#
#     Return True if bool(x) is True for any x in the iterable.
#     如果传入的可迭代对象的任何值为真,则返回值为真;如果为空则为假【任何一个值都为真就为真,全部为假才是假】
#     If the iterable is empty, return False.
##############################################################################################################
# 9.利用内置函数将十进制数字12,分别转换成二进制,八进制,十六进制表示的字符串
# num = 12
# print(bin(num)) #bin()十进制转换为二进制
# 0b1100
# print(oct(num))   #oct()十进制转换为八进制
# 0o14
# print(hex(num))     #hex()十进制转换为十六进制
# 0xc
##############################################################################################################
# 10.简述内置函数dir,help,type作用
# 内置函数dir :查看某一个指定对象的内置方法有哪些
# 内置函数help:查看某一个指定类的类库详情
# 内置函数type:查看某一个对象的类型(type本身就是所有类的母类)
##############################################################################################################
# 11.简述内置函数globals(),locals()作用
# 内置函数globals:获取当前代码下的所有的全局变量
# 内置函数locals:获取当前代码下的所有的局部变量
##############################################################################################################
# 12.简述三元运算书写格式
# 结果为真时输出  if+条件 else 结果为假时输出
# print(1 if 5<3 else 2)
# print('条件为真时输出我'if 1<2 else '条件为假时输出我')
##############################################################################################################
# 13.简述lambda表达式
# lambda:匿名函数,使用场景一般用于简单函数,或者在只是用一次的环境下,不需要花费时间重新定义函数的情况下
# a = [1,2,3,4,5]
# print(list(map(lambda b:b**2,a)))
# [1, 4, 9, 16, 25]
#一般用法:变量名 = lambda 变量(可多个):算式(简单算式)
#################################################################################################################
# 14.利用内置函数zip(),实现功能
# l1=["alex",22,33,44,55]
# l2=["is",22,33,44,55]
# l3=["good",22,33,44,55]
# l4=["guy",22,33,44,55]
# 请获取字符串s="alex_is_good_guy"
# l = list(zip(l1,l2,l3,l4))
# l_1 = l[0]
# l_2 = '_'.join(l_1)
# print(l_2)
# alex_is_good_guy
# print('_'.join(list(zip(l1,l2,l3,l4))[0]))
#################################################################################################################
# 15.简述文件打开模式,r和rb的区别
# r :read()返回的数据类型是str型
# rb:readbytes()返回的数据类型是bytes
#################################################################################################################
# 16.文件操作时with的作用
# 文件操作的with会在python中自动调用close()方法,使代码更简洁
#################################################################################################################
# 17.利用with实现同时打开两个文件(一读一写)
# with open('test.txt','r',encoding='utf-8') as f2 ,open('test.log','w',encoding='utf-8') as f1:
#     r2 = f2.read()
#     print(r2)
#     f1.write('pandaboy')
#################################################################################################################
# 18.函数默认返回值是什么
# None
#################################################################################################################
# 19.简述函数的普通参数,指定参数,默认参数,动态参数的特点以及注意事项
# 函数的普通参数:严格按照顺序,将实际的参数数值赋值给形式参数
# 函数的指定参数:指定参数和默认参数(关键字参数):默认参数必须放在参数列表的最后,指定参数将实际的参数赋值给制定的形式参数
# 函数的动态参数(可变参数):允许用户输入的信息是不同的数据类型,可以是列表、字典、元祖等(*args,**kwargs)
#################################################################################################################
# 20.通过字符串格式化将7.88123输出时仅保留小数点后两位,列如:bala7.88bala
# str1 = 134351.5432132
# deal = '{0:.2f}'.format(str1)
# print(deal)
#################################################################################################################
# 21.判断以下字符串格式化是否正确,如果不正确请改正
# tpl1 = "i am{name},age{age},really{name}".format(name = "seven",age = 18)--->正确
# tpl2 = "i am{0},age{1}".format(["seven",18])
#           |
#           |
# tpl2 = "i am{0},age{1}".format("seven",18)
#################################################################################################################
# 22.python有几种导入模块的方式
# 常规导入:1---import sys
#           2---import sys as syss
# 使用from语句导入
# 相对导入
# 可选导入
# 局部导入
#################################################################################################################
# 23.分页,如果有192个商品,每页显示10个商品,问共需要几页
# import math
# shop_item = 192
# page_item = 10
# page = shop_item/page_item
# print(math.ceil(page))#向上取整数
#################################################################################################################
# 24.函数传递参数时,是引用还是复制值?
# python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。
# 这种方式相当于传值和传引用的一种综合。
# 如果函数收到的是一个可变对象(比如字典或者列表)的引用,
# 就能修改对象的原始值--相当于通过“传引用”来传递对象。
# 如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
#################################################################################################################
# 25.python3中的range函数和python2.7中的range函数有什么区别?
# range的返回值不同。
# python2.7的range函数返回的是一个列表值
# python3的range函数返回的是一个可迭代对象
#################################################################################################################
# 26.python中导入模块时,如何搜索路径?
# import语句导入指定的模块时会执行三个步骤
#     1.在指定路径下搜索模块文件,找到模块文件
#     2.指定的模块在被导入时就会被编译成字节码,即编译成.pyc文件
#     3.依靠模块的代码中的定义来创建其所定义的对象,模块文件中的所有语句会依次执行,
#     从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性
#     但是请注意:模块只在第一次导入时才会执行如上步骤,后续的导入操作只不过是提取内存中已加载的模块对象
#     可以使用reload()命令重新加载指定的模块
#################################################################################################################
# 27.sys.argv的作用
# import sys
# print(sys.argv)
# 返回一个列表值,列表中的内容为当前文件的绝对路径
#################################################################################################################
# 28.如何获取一个路径的上级目录的路径
# import os
# abspath = os.getcwd()
# # path = os.path.abspath(os.path.join(os.path.dirname(abspath),os.path.pardir))
# path1 = os.path.abspath(os.path.dirname(abspath))
# # print(abspath)
# # print(path)
# print(path1)
#################################################################################################################
# # 29.请将下三个路径按照a,b,c的顺序拼接起来
# a= "/users/sever"
# b = "lib"
# c = "bin"
# import os
# d = os.path.join(a,b,c)
# print(d)
#################################################################################################################
# 30,简述获取一个随机字母的思路
# 思路1:直接利用ascII值获取随机数
# 1.random获取随机整数
# 2.ASCII的字母值分别为97-122,65-90
# 3.循环随机取两个范围中的一个值
import random,string
num1 = random.randint(97,122)
num2 = random.randint(65,90)
for i in random.sample([num1,num2],1):print(chr(i))
# 思路二:内置方法
print(random.choice(string.ascii_letters))