python学习笔记9-其他

计算x的n次方

def power(x,n):
    s=1
    while n>0:
       n=n-1
       s=s*x
    return s
print(2,4)

计算aa+bb+c*c+……

def calc(*numbers):
    sum=0
    for n i numbers:
       sum=sum+n*n
    return sum
print(calc(2,4,5))

如何在一个函数内部修改全局变量

利用global修改

a=5
def fn():
   global a
   a=4
fun()
print(a)

命令行启动程序并传参python 1.py 22 33 ,则print(sys.argv)会输出什么

#会输出文件明和参数构成的列表
['1.py','22','33']

递归求和

def get_sum(num):
    if num>=1:
	    res=num+get_num(num-1)
	else:
	    res=0
	return res
res=get_num(10)
print(res)

递归的基本的骨架

def recursions(n):
    if n==1:
	    return 1
	return n*recursions(n-1)

python递归深度默认是多少?递归深度限制的原因是什么?

python递归深度可以用内置函数库中的sys.getrecursionlimit()查看。因为无限递归会导致栈溢出和python崩溃

如何判断是函数还是方法

#看它的调用者是谁,如果是类,那么就需要传入一个参数self的值,这是它就是一个函数。如果调用者是对象,那么就不需要给self传入参数值,这时它就是一个方法
print(isinstance(obj.func,FunctionType)) #False
print(isinstance(obj.func,MethodType)) #True
#方法无需传入self参数;函数必须手动传入self参数

打印1~10的数字以及每个数的平方、几何级数和阶乘

from math import factorial
def main():
    print('%-10s%-10s%-10s%-10s'%('数字','平方','几何级数','阶乘'))
    for num in range(1,11):
        print('%-12d%-12d%-12d%-12d'%(num,num**2,2**num,factorial(num)))

if __name__=='__main__':
   main()

统计字符串中英文字母和数字各自出现的次数

import string

def count_letter_number(str1):
    """
    >param string:给定一个字符串
    >return:由字符串中英文字幕和数字各自出现的次数组成的元组 
    """
    m=0#统计英文字母
    n=0#统计数字
    for s in str1:
        if s in string.ascii_letters:
            m+=1
        elif s in string.digits:
            n+=1
    return m,n

def main():
    print(count_letter_number('a1b2c3d4'))  #(4,4)
    print(count_letter_number('a123456b'))  #(2,6)
    print(count_letter_number('123456!!'))  #(0,6)

if __name__=='__main__':
    main()

判断传入的整数列表(要求元素个数大于2)中的元素能否构成等差数列

import string

def is_arithmetic_series(num_list):
    """
    >param num_list:给定判断的列表
    >return:是等差数列返回True,否则返回False
    """

    num_list.sort()
    difference=num_list[1]-num_list[0]
    for x in range(len(num_list)-1):
        if num_list[x+1]-num_list[x] != difference:
            return False
    return True

def main():
    list1 = [1,3,5,7,9]
    list2 = [100,500,200,400,300]
    list3 = [1,2,3,5,6,7]
    print(is_arithmetic_series(list1))
    print(is_arithmetic_series(list2))
    print(is_arithmetic_series(list3))
    print(list2)

if __name__=='__main__':
    main()

计算字符串中所有数字序列的和

import re
def sum_num_seq(string):
    ```
	>param string:
    >return:返回里面数字序列的的和
    ```
    nums=re.compile(r'\d+')
	mylist=nums.findall(string)
	my_sum=0
	for num in mylist:
	    my_sum+=int(num)
	return my_sum

def main():
    print(sum_num_seq('a1b2c3d4'))
    print(sum_num_seq('123hello456good789bye'))
    print(sum_num_seq('12345678'))
    print(sum_num_seq('abcdefgh'))

if __name__=='__main__':
    main()

对传入的字符串(假设字符串中只包含小写字母和空格)进行加密操作,加密的规则是a变d,b变e……空格不变,返回加密后的字符串

import string
def caesar_encrypt(string):
    """
    >param string:给定一个字符串
    >return:返回加密后的字符串
    """
    new_string=''
    all_string=string.ascii_lowercase
    for x in string:
        if x in all_string:
            index=all_string.find(x)
            if index>=len(all_string)-3:
                new_string+=all_string[len(all_string)-index+3]
            else:
                new_string+=all_string[index+3]
        else:
            new_string+=x
    return new_string

def main():
    print(caesar_encrypt('attack at dawn'))
    print(caesar_encrypt('dinner is on me'))

if __name__=='__main__':
    main()

设计“跳一跳”游戏的计分函数,“跳一跳”游戏中黑色小人从一个方块跳到另一个方块上会获得1分,如果跳到方块的中心点上回获得2分,连续跳到中心点会一次获得2分、4分……该函数传入一个列表,列表中用布尔值True和False表示是否跳到方块的中心的,函数返回最后获得的分数。

def cale_score(jump_list):
    """
    ?param jump_list:给定一个列表
    >return:返回最后获得的分数
    """
    total=0
    for index,x in enumerate(jump_list):
        if x:
            total+=2
            for y in range(index-1,-1,-1):
                if jump_list[y]:
                    total+=2
                else:
                    break
        else:
            total+=1
    return total
def main():
    list1=[True,False,True,False,True]
    list2=[True,True,False,True,False,True]
    list3=[False,True,True,False,False,True,True]
    print(cale_score(list1))
    print(cale_score(list2))
    print(cale_score(list3))

if __name__=='__main__':
    main()

统计一个字符串中出现频率最高的字符及其出现的次数

def find_most_freq(string):
    """
    >param string:输入一个字符串
    >return:返回字符串中出啊洗脑频率最高的字符及其出现次数
    """

    my_dict={}
    for x in string:
        if x not in my_dict:
            my_dict[x]=1
        else:
            my_dict[x]+=1
    max_num=0
    for y in my_dict:
        if my_dict[y]>max_num:
            max_num=my_dict[y]
    max_list=[]
    for z in my_dict:
        if my_dict[z]==max_num:
            max_list+=z
    return max_list,max_num

def main():
    print(find_most_freq('aabbccddaaacc'))
    print(find_most_freq('hello world'))
    print(find_most_freq('a1bab2bcc3d4aa'))

if __name__=='__main__':
    main()

传入连个代表日期的字符串,计算连个日期相差多少天。

def is_leap_year(year):
    """
    >param year:给定一个年份
    >retrun:闰年返回true,否则返回False
    """
    return(year%400==0 or year % 100 != 0) and year % 4 == 0

def my_data(data):
    """
    >param year:给一个日期的字符串
    >retrun:返回一个整型的年月日的元组
    """    
    data_year=data[:data.find('-')]
    data_month=data[data.find('-')+1:data.find('-')]
    data_day=data[data.rfind('-')+1:]
    return int(data_year),int(data_month),int(data_day)

def days_month(year):
    """
    >param year:给定一个年份
    >retrun:返回一个包含所有月份天数的列表
    """
    year_days_month=[
        [31,28,31,30,31,30,31,31,30,31,30,31],
        [31,29,31,30,31,30,31,31,30,31,30,31]
    ][is_leap_year(year)]
    days_sum=0
    return year_days_month

def diff_days(data1,data2):
     """
    >param data1:一个日期的字符串
    >param data2:另一个日期的字符串
    >retrun:返回两个日期中间间隔了多少天
    """

    if my_data(data1)[0] == my_data(data2)[0]:
        years_day = days_month(my_data(data1)[0])
        total1=0
        for index in range(my_data(data1)[1]-1):
            total1 += years_day[index]
        days_data1 = total1+my_data(data1)[2]
        total2=0
        for index2 in range(my_data(data2)[1]-1):
            total2 += years_day[index]
        days_data2 = total2+my_data(data2)[2]
    else:
        (data1,data2) == (data1,data2) if my_data(data1)[0] > my_data(data2)[0] else (data2,data1)
        data1_years_day = days_month(my_data(data1)[0]
        total1 = 0
        for index in range(my_data(data1)[1]-1):
            total1 +=data1_years_day[index]
        days_data1 = total1 + my_data(data1)[2]
        data2_years_day = days_month(my_data(data2)[0])
        total2 = 0
        for index2 in range(my_data(data2)[1]-1):
            total2 += data2_years_day[index2]
        days_data2 = total2 + my_data(data2)[2]
        years_sum = 0
        for num in data2_years_day:
            years_sum += num
        m_years_sum = 0
        for year in range(my_data(data2)[0]+1,my_data(data1)[0]):
            year_days = days_month(year)
            for day in year_days:
                m_years_sum += day
        return years_sum-days_data2+days_data1+m_years_sum

def main():
    print(diff_days('2021-5-2','2017-9-1'))

if __name__=='__main__':
    main()

变量的作用域有哪些

在python中,一个变量的作用域总是由在代码中北赋值的地方所决定。python会按照如下顺序搜索变量:
本地作用域(local)--》 当前作用域被嵌入的本地作用域(enclosing locals) --》 全局/模块(Global)--》内置作用域(built-in

获取1-100中被6整除的偶数?

alist = []
for i in range(1,100):
    if i % 6 ==0;
        alist.append(i)
print(alist)

什么是缺省参数?

缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会代替默认参数

递归函数停止的条件是什么?

递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是return;返回种植递归。终止的条件包括:
判断递归的次数是否达到某一个限定值
判断运算的结果是否达到某个范围等,根据设计的目的来选择

回调函数是如何通信的

回调函数是把函数的指针(地址)作为参数传递给另一个函数,将整个函数当作一个对象,赋值给调用的函数

实现将1-N进行分组,每组三个数

print([[x for x in range(1,10)][i:i+3] for i in range(0,10,3)])

模块

内置模块:例如os,random,time和sys模块
第三方模块:如pygame,需要安装
自定义模块:自己写的模块
导入模块的方式: import 模块名 或者 from 模块名 import 函数名/*
内置函数中os模块是负责程序与操作系统的交互,提供了访问操作系统底层的接口,而sys模块是负责程序与python解释器的交互,提供了一系列的函数和变量,用于操纵python时运行的环境

列出当前目录下的所有的文件和目录名

import os
for i in os.listdir('.'):
    print(d)

执行shell脚本

import subprocess
result = subprocess.getoutput('dir')
print(result)

输出某个路径下的所有文件和文件夹的路径

def print_dir():
    filepath = input("请输入一个路径:")
    if filepath == "":
        print("请输入正确的路径:")
    else:
        for i in os.listdir(fiilepath):
            print(os.path.join(filepath))
print(print_dir())

随机生成100个数,然后写入到文件中

  • 打开一个新文件
  • 随机生成一个(整数或小数),并将该数写入文件中
  • 循环第2 步,直到完成100个随机数的生成
import random
fp = open("C:\\a.txt","w")
for i in range(1,101):
    n = random.randint(1,1000)
    fp.write(str(i)+ " " + str(n) + "\n")
fp.close()

有一个使用utf8编码的文件a.txt,文件路径是C盘目录,请写一段程序逐行读取这个文本文件,并在屏幕(GBK编码)上打印出来

#coding=utf-8
import  chardet #查看字符串的编码方式模块

fp = open("C:\\me.txt")
lines = fp.readlines()
fp.close()
for line in lines:
    print line.decode("utf-8").encode('gbk',"ignore")

删除文件和用Linux命令删除文件方法分别是什么?

在Linux中可以使用rm命令,python可以使用os.remove(文件名)

import os
file = r'C:\\test.txt'
if os.path.exists(file):
    os.remove(file)
    print('delete success')
else:
    print('no such file:%s'%file)

获取当前路径

可以使用函数getcwd(),从模块os中将其导入

import os 
os.getcwd()  #查看当前路径
type(os.getcwd)
os.chdir("D:\\")  #修改当前路径
os.getcwd()

dir函数的作用

**内置函数dir可以找到模块内定义的所有的名称,以一个字符串列表的形式返回

with方法打开文件做了什么?

打开文件在进行读写的时候可能会出现一些异常情况,如果按照常规的fopen写法,那么需要try、except和finally来做异常判断,并且我呢见最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法默认实现了finally中f.close

简述read、readline、readlines的区别

read读取整个文件;readline读取下一行数据,使用生成器方法;readlines读取整个文件到一个迭代器中以供遍历使用,比较方便

pickle模块的作用

将对象写入文件或者数据库中,称之为数据的持久化保存。序列化是将对象的状态信息转化为可以存储或传输的形式的过程

  • 序列化后存入文件
    pickle.dump(对象,文件对象)
  • 从文件中反序列化对象
    pickle.load(文件对象)
    使用pickle模块需要注意以下几点
  • 只能在python中使用,支持python的基本数据类型
  • 可以处理复杂的序列化语法(例如自定义的类的方法、游戏的存档等)
  • 序列化的时候,只是序列化了整个序列对象,而不是内存地址
    pickle.dumps()方法可以把任意对象序列化成一个bytes。所以首先需要创建一个对象即u=User(),然后再把这个对象序列化
u = User()
bytes = pickle.dumps(u)
#反序列化
object1 = pickle.loads(bytes)
posted @ 2021-05-01 23:35  MTcx  阅读(221)  评论(0编辑  收藏  举报