day6

一.函数多个返回值和匿名函数

#函数返回多个值,用一个变量接收
def say():
    num1=1
    num2=2
    num3=3
    return num1,num2,num3
res=say()
print(res)  #打印出来是元组。 函数如果返回多个值的话,会把返回的值都放在一个元组里

#函数返回多个值,多个变量接收
res1,res2,res3=say()
print(res1)
print(res2)
print(res3)   #分别打印三个值。函数返回多个值,分别指定变量接收可以得到每个单独的返回值

#匿名函数:这个函数功能简单,只用一次
res=lambda x:x+1
print(res(1))

二.列表生成式

import random
red_num=random.sample(range(1,34),6)
new_num=[str(num).zfill(2) for num in red_num]#列表生成式
# new_num=[] 上面这一行等于下面这四行
# for num in red_num:
#     tmp=str(num).zfill(2)
#     new_num.append(tmp)
print(new_num)

#例子:列表生成式
# l=[i for i in range(1,101,2)] #是list,生成100以内的奇数
#如果列表生成式外层变成():
l=(i for i in range(1,101,2))  #不是list,不是元组,生成一个生成器 结果:<generator object <genexpr> at 0x000002987E855830> 生成器
print(l)
# for i in l:
#     print(i) # 循环输出l,能得到正确数字
#()生成一个生成器,节省内存,按照一定的规则得出结果,只占用一块内存空间,[]每个元素都占用一块内存空间,生成器只能通过循环取来用
print(l.__next__())
print(l.__next__()) # 不能根据下标取值,__next__()可以取到下一个值

三.三元运算符

#三元运算符
a=5
b=4
# if a > b:
#     c=a
# else:
#     c=b

c=a if a>b else b  #三元表达式,等同于上面四行

四.os模块

import os
#对操作系统的一些操作
print(os.getcwd())#取当前工作目录
os.chmod("x.py",2)#给文件/目录加权限,对Windows的下面不好使
# 1  执行
# 2 写
# 4 读
# #chmod
print(os.chdir("../day5"))#更改当前目录
print(os.getcwd())
#
print(os.makedirs("nhy/python"))#递归创建文件夹,父目录不存在时创建父目录
print(os.mkdir("zll/huangrong"))#创建文件夹
# makedirs 创建文件夹的时候,如果父目录不存在会自动帮你创建父目录
print(os.removedirs("nhy/python"))#递归删除空目录
print(os.rmdir("test2"))#删除指定的文件夹
#只能删除空目录
os.remove("test2")#只能删除文件
os.rmdir('test2') #只能删文件夹

print(os.listdir('e:\\'))#列出一个目录下的所有文件

os.rename("test","test1")#重命名
print(os.stat("x.py"))#获取文件信息

print(os.sep)#当前操作系统的路径分隔符 #

# day5+os.sep+x.py
print(os.linesep)#当前操作系统的换行符
# \n  \r\n
print(os.pathsep)#当前系统的环境变量中每个路径的分隔符,linux是:,windows是;
print(os.environ)#当前系统的环境变量
print(os.name)#当前系统名称  Windows系统都是nt linux都是posix
res = os.system('ipconfig')  #执行操作系统命令的,但是获取不到结果
res = os.popen('ipconfig').read()  #可以获取到命令执行的结果
# __file__ #获取到当前文件的绝对路径
print(os.path.abspath(__file__))#获取绝对路径
print(os.path.split("/usr/hehe/hehe.txt"))#分割路径和文件名

print(os.path.dirname("e:\\syz\\ly-code"))#获取父目录,获取它的上一级目录
print(os.path.basename("e:\\syz\\ly-code\\a.txt"))#获取最后一级,如果是文件显示文件名,如果是目录显示目录名
print(os.path.exists(r"E:\syz\ly-code\day6"))#目录/文件是否存在
print(os.path.isabs("../day5"))#判断是否是绝对路径
print(os.path.isfile("xiaohei.py"))
#判断是否是一个文件,1、文件要存在2、必须是一个文件
print(os.path.isdir("e:\\syz1"))#是否是一个路径,目录是否存在
size = os.path.getsize('x.py') #获取文件的大小
#不能超过2m
print(size)

print(os.path.join("root",'hehe','mysql','a.sql'))#拼接成一个路径

#获取目录下内容  
os.listdir()  #只能列出内容

#os.walk() 获取到文件下的内容,得到的是生成器 for abs_path,dir,file in os.walk(r'E:\syz\ly-code\day6'): # # print(abs_path,dir,file) # abs_path 当前循环的绝对路径 # dir 目录下面所有的文件夹 [ ] # file 目录下面的所有文件 []

小练习:

#把双数日期的日志,写点东西进去
#1.获取log目录下面所有文件 os.walk()
#2.根据文件名来判断,是否双数日期,分割字符串,取到日期
#3.日期%2==0
#4.打开文件open()

# import os
# for root, dirs, files in os.walk(r"logs\logs"):
#     for i in files:
#         a=i.split('.')[0]
#         if int(a.split('-')[2])%2==0:
# #            with open(root+os.sep+i,"w") as f:
#             open(os.path.join(root, i),'w').write("xxxx")
#
#

# import os
# for root,dir,file in os.walk(r'logs\logs'):
#     for i in file:
#         if int(i.split('.')[0].split('-')[-1])%2==0:
#             open(os.path.join(root,i),'w').write("lily")

import os
for abs_path,dir,file in os.walk(r'logs\logs'):
    for i in file:
        print(i)
        if int(i.split('.')[0].split('-')[-1]) % 2 == 0:
            open(os.path.join(abs_path,i),'w',encoding='utf-8').write('hang')

五.sys模块

#给python添加环境变量
import sys
print(sys.platform) #判断操作系统
print(sys.path) #python 环境变量
#当你的文件中需要引入不在当前文件夹下的文件时,需要把上层文件夹加入环境变量
sys.path.append(r'D:\besttest\自动化\Day3')#把这个路径加入path的第一位,可以提高导入效率 sys.path.insert(0,r'D:\besttest\自动化\Day3') import zl #导入时会执行zl.py一遍 from zl import my #不要写*,因为import很多文件时,就不知道是哪个文件里的方法了 my() #导入文件时,先在当前目录下找py文件,没有的话到python的环境变量path中的路径下去找 print(sys.argv) #用来获取命令行里面运行py文件的时候传入的参数

脚本接收参数的方法:

import sys

command=sys.argv
print(command)
if len(command)>1:
    cmd1=command[1]  #接收第一个参数,如果有第二个就是[2]
    if cmd1=='--help':
        print('这个是帮助文档'
              '这个python文件用来说明sys.argv的作用')
    elif cmd1=='os':
        print(sys.platform)

六.时间模块

import time

# 1. 时间戳  从unix元年到现在,秒
# 2. 格式化好的时间

print(time.time())
#
# time.sleep(3)


print(time.strftime('%Y%m%d%H%M'))
print(time.strftime('%D %H:%M:%S'))
print(time.strftime('%y'))

#时间与时间戳互相转换
#先转换为时间元组
print(time.gmtime()) # 默认取的是标准时区
print(time.localtime()) #取当前时区的时间,参数为“秒” ,不传参数是当前时间

print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))

print(time.strftime(str(time.time()).split('.')[0]))

# ***********时间戳转换为格式化时间
def timestamp_to_format(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
    if timestamp:
        time_tuple = time.localtime(timestamp)
        res = time.strftime(format,time_tuple)
    else:
        res = time.strftime(format)

    return res
# ***********

# ************格式化时间转换为时间戳
print(time.strptime('2018-4-21','%Y-%m-%d'))
print(time.mktime(time.strptime('2018-4-21','%Y-%m-%d')))
def format_to_timestamp(str=None,format='%Y%m%d%H%M%S'):
    if str:
        tp = time.strptime(str,format)
        res = time.mktime(tp)
    else:
        res = time.time()
        # 没有参数就是当前时间
    return int(res)
# ***********


print(format_to_timestamp())
print(format_to_timestamp('2008-08-08','%Y-%m-%d'))
print(format_to_timestamp('20080808200801'))
print(format_to_timestamp('200808082008'))

import datetime
print('当前时间: ' , datetime.datetime.today())    #精确时间
print('当前时间: ' , datetime.date.today())        #精确到‘天’
five_days_later = datetime.date.today() + datetime.timedelta(days=5)
two_days_before = datetime.date.today() + datetime.timedelta(days=-2)
ten_minutes_later = datetime.datetime.today() + datetime.timedelta(minutes=10)

print(type(five_days_later))

print('5天后的时间: ' , five_days_later)
print('2天前的时间: ' , two_days_before)
print('10分钟后的时间: ' , ten_minutes_later)

七. 字典排序

d={'a':1,'b':2,'c':3}
print(d.items())  #字典是无序的,直接对字典排序是不存在的
#结果 dict_items([('a', 1), ('b', 2), ('c', 3)])
res=sorted(d.items(),key=lambda x:x[1])  #根据字典value排序
                                            # sorted做了两件事:1.循环 2.排序  循环的时候把每一个二维数组传给lambda,
                                            # lambda中返回二维数组的下标为1的元素作为key,sorted再根据这个key排序
#print(res)

#sort

l=[
    [1,2,3,4],
    [1,2,3,4],
    [1,2,3,4],
    [1,2,3,4],
    [1,2,3,4],
]
for d in l:
    print(d)
#结果
# [1, 2, 3, 4]
# [1, 2, 3, 4]
# [1, 2, 3, 4]
# [1, 2, 3, 4]

for a,b,c,d in l:
    print(a,b,c,d)
#结果
# 1 2 3 4
# 1 2 3 4
# 1 2 3 4
# 1 2 3 4
# 1 2 3 4

def is_float(s:str,l:list): #传参指定类型
    s = str(s)
    if s.count('.')==1:#小数点个数
        s_list = s.split('.')
        left = s_list[0]  #小数点左边
        right = s_list[1] #小数点右边
        if left.isdigit() and right.isdigit():  #正小数
            return True
        elif left.startswith('-') and left.count('-')==1 and \
                left.split('-')[1].isdigit() and \
                right.isdigit():  #判断合法负小数
                return True
    return False

def my(name:str):
    print(name)
my("xiao")
my(['234','w3er'])  #虽然指定了参数类型,但是其实没有作用,知道这种参数指定类型的写法就行了,没有用

八.数据库操作

import pymysql

# 1、 连接数据库 账号、密码、ip、端口号、数据库
# 2、建立游标
# 3、执行sql
# 4、获取结果
# 5、关闭游标
# 6、连接关闭

conn = pymysql.connect(
    host='118.24.3.40',user='jxz',passwd='123456',
    port=3306,db='jxz',charset='utf8'
    #port必须为int
    #charset这里必须为utf8
)

cur = conn.cursor()
cur.execute('insert into zhangli_users values("zhangli","xxxxxxxxxxxx");')
cur.execute('commit;')
conn.commit()
cur.execute('select * from zhangli_users where username = "zhangli";')
res = cur.fetchall()
print(res)
cur.execute('select * from zhangli_users where username = "hang";')
res = cur.fetchall()
print(res)
cur.close()#关闭游标
conn.close()#关闭连接
#一个优化的db方法, 更加好的方法讲了class之后会讲
def my_db(host,user,passwd,db,sql,port=3306,charset='utf8'):
    import pymysql
    conn = pymysql.connect(user=user,host=host,port=port,passwd=passwd,db=db,charset=charset)
    cur = conn.cursor() #建立游标
    cur.execute(sql)    #执行sql
    if sql.strip()[:6].upper() == 'SELECT'
    if sql.startwith('select'):
        res = cur.fetchall()
    else:
        conn.commit()
        res = 'OK'
    cur.close()
    conn.close()
    return res

九. 加密(md5)

import hashlib
passwd = 'password'
m = hashlib.md5()

print(passwd.encode(),'\n')


m.update(passwd.encode())   #不能直接对string加密,必须是byte类型才能加密
print(m.hexdigest())

def my_md5(string1):

    import hashlib
    new_str = string1.encode()
#    new_str1 = b'%s'%string1    #两者作用一样
    m = hashlib.md5()   #md5实例化
    m1 = hashlib.sha256()
    m.update(new_str)
    m1.update(new_str)

    return m.hexdigest(),m1.hexdigest()

print(my_md5('password'))
上一篇:vue项目中如何做IE游览器的限制提示


下一篇:简明python_Day6_模块、包