Python学习笔记(Day6-Day10)

Day6:函数与Lambda表达式

函数

定义:

  • 函数以def关键词开头,后接函数名和圆括号()。
  • 函数执行的代码以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。
  • 定义中() 内是形参
  • 参考

Lambda表达式

  • 使用 lambda 关键词来创建匿名函数
  • 语法结构 lambda argument_list: expression
  • lambda - 定义匿名函数的关键词。
  • argument_list - 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。
  • : 冒号,在函数参数和表达式中间要加个冒号。
    expression - 只是一个表达式,输入函数参数,输出一些值。
    注意:
  • expression 中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。
  • 匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 参考

练习题

#怎么给函数编写⽂档?
在函数头(包含def关键字的那一行)的下一行用一对单引号或双引号将注释括起来。
可以使用"__doc__"help()查看

def add (x,y):
    "求和"
    return x + y

print(add.__doc__)
#输出结果
#计算两个数的和


#怎么给函数参数和返回值注解?
def func(x: int, y: int) -> int:
#闭包中,怎么对数字、字符串、元组等不可变元素更新。
使用 nonlocal 关键字
#分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)
a = [[6, 5], [3, 7], [2, 8]]
a = sorted(a,key=lambda i:i[0])

a = sorted(a,key=lambda i:i[-1])

#利用python解决汉诺塔问题?
def move(n, a, b, c):
    if n == 1:
        print(a, "->", c)
    else:
        print(a, "->", b)
        move(n - 1, a, b, c)
        print(b, "->", c)


move(64, "a", "b", "c")

Day7 - 8:类、对象与魔法方法

类与对象

  • 同 c++ 类似,但是没有private、public、protected关键词,默认的成员函数和成员变量都为公开
  • self 关键词对应 c++ 中的 this
  • 存在 __init__ () 的特殊方法(构造方法),该方法在类实例化时会自动调用,应该就是构造函数
  • 公有和私有:定义私有变量只需要在变量名或函数名前加上**“__”**两个下划线
  • Python 严格要求方法需要有实例才能被调用,这种限制其实就是 Python 所谓的绑定概念:Python 对象的数据属性通常存储在名为.__ dict__的字典中,我们可以直接访问__dict__,或利用 Python 的内置函数vars()获取.__ dict__

练习题

1、以下类定义中哪些是类属性,哪些是实例属性?

class C:
    num = 0
    def __init__(self):
        self.x = 4
        self.y = 5
        C.count = 6
num = 0 ,C.count = 6是类属性 
self.x = 4 self.y = 5是实例属性

2、怎么定义私有⽅法?
在变量名或函数名前加上 __ 两个下划线

3、尝试执行以下代码,并解释错误原因:

class C:
    def myFun():
        print('Hello!')
    c = C()
    c.myFun()
    myFun()的括号内应该输入self
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。

要求:

平日票价100元
周末票价为平日的120%
儿童票半价
class Ticket():
	def __init__(self,time,adult_n,child_n):
        self.time=time
        self.adult_n=int(adult_n)
        self.child_n=int(child_n)
        
    def get_price(self):
        if self.time=="weekday":
            adult_p=120
            child_p=60
        if self.time=="workday":
            adult_p=100
            child_p=50
        total_p=self.adult_n*adult_price+self.child_n*child_p
        print("总票价是:%d" %total_p )

time=input("请输入去公园的时间(weekday or workday):")
adult_n=int(input("请输入成人数:"))
child_n=int(input("请输入小孩数:"))
t=Ticket(time,adult_number,child_number)
t.get_price()

魔法方法

  • 魔法方法总是被双下划线包围,例如__init__。

  • 魔法方法是面向对象的 Python 的一切。

  • 魔法方法的“魔力”体现在它们总能够在适当的时候被自动调用。

  • 魔法方法的第一个参数应为cls(类方法) 或者self(实例方法)。

练习题

__new__(cls[, ...])
 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__。
__new__对当前类进行了实例化,并将实例返回,传给__init__的self。但是,执行__new__,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。

__init__(self[, ...]) 构造器,当一个实例被创建的时候调用的初始化方法

__str__(self):
当你打印一个对象的时候,触发__str__
当你使用%s格式化的时候,触发__str__
str强转数据类型的时候,触发__str__

__repr__(self)
reprstr的备胎
有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
repr(obj)内置函数对应的结果是__repr__的返回值
当你使用%r格式化的时候 触发__repr__

__getitem__(self, key)定义获取容器中元素的行为,相当于self[key]。

__setitem__(self, key, value)定义设置容器中指定元素的行为,相当于self[key] = value。

利用python做一个简单的定时器类

要求:

  • 定制一个计时器的类。
  • start和stop方法代表启动计时和停止计时。
  • 假设计时器对象t1,print(t1)和直接调用t1均显示结果。
  • 当计时器未启动或已经停止计时时,调用stop方法会给予温馨的提示。
  • 两个计时器对象可以进行相加:t1+t2。
  • 只能使用提供的有限资源完成。
  • python的time库

import time


class Mytime(object):
    def __init__(self):
        self.__info = '未开始计时!'
        self.__begin = None
        self.__end = None
        self.__jg = 0

    def __str__(self):
        return self.__info

    def __repr__(self):
        return self.__info

    def start(self):
        print('计时开始...')
        self.__begin = time.localtime()

    def stop(self):
        if not self.__begin:
            print('提示:请先调用start()开始计时!')
            return
        self.__end = time.localtime()
        self.__jg = time.mktime(self.__end) - time.mktime(self.__begin)
        self.__info = '运行了%d秒' % self.__jg
        print('计时结束!')
        return self.__jg

    def __add__(self, other):#加号重载
        return '共运行了%d秒' % (other.__jg + self.__jg)


t1 = Mytime()
print(t1)
# 未开始计时!
t1.stop()
# 提示:请先调用start()开始计时!
t1.start()
# 计时开始...
time.sleep(5)
t1.stop()
# 计时结束!
print(t1)
# 运行了5秒
t2 = Mytime()
t2.start()
# 计时开始...
time.sleep(7)
t2.stop()
# 计时结束!
print(t2)
# 运行了7秒
print(t1 + t2)
# 共运行了12秒

Day9:模块与datetime模块

模块:

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 Python 标准库的方法。

命名空间

  • 内置命名空间(Built-in Namespaces):Python 运行起来,它们就存在了。内置函数的命名空间都属于内置命名
    空间,所以,我们可以在任何程序中直接运行它们,比如 id() ,不需要做什么操作,拿过来就直接使用了。
  • 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的全局命名空间,不同模块的全局
    命名空间彼此独立,不同模块中相同名称的命名空间,也会因为模块的不同而不相互干扰。
  • 本地命名空间(Function & Class:Local Namespaces):模块中有函数或者类,每个函数或者类所定义的命名
    空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了。

导入模块

  • import 模块名
  • from 模块名 import 函数名
  • import 模块名 as 新名字

if name == ‘main

  • 程序的入口,类似于c/c++中的main函数作用

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
创建包:

  • 创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
  • 在文件夹中创建一个 init.py 的模块文件,内容可以为空。
  • 将相关的模块放入文件夹中。
    参考

练习题

1、怎么查出通过 from xx import xx导⼊的可以直接调⽤的⽅法?
当包内的__init__.py模块下有__all__列表时,则为__all__列表内定义的所有子模块。没有__all__列表时,需要看__init__.py内的代码做具体判断。
2、了解Collection模块,编写程序以查询给定列表中最常见的元素。

题目说明:

  • 输入:language = [‘PHP’, ‘PHP’, ‘Python’, ‘PHP’, ‘Python’, ‘JS’, ‘Python’, ‘Python’,‘PHP’, ‘Python’]

  • 输出:Python

  • collection模块

from collections import Counter
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
def most_element(language):
    count = Counter(language)
    result = count.most_common(1)
    return result[0][0]
result = most_element(language)
print(result)
# Python

datetime模块

datetime 是 Python 中处理日期的标准模块,它提供了 4 种对日期和时间进行处理的类:datetime、date、time 和 timedelta。

练习题

1、假设你获取了用户输入的日期和时间如2020-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:

from datetime import datetime, timezone, timedelta
def to_timestamp(dt_str, tz_str):
    t,tz=dt_str,tz_str
    tz=tz.split(':')[0].split('+')
    #str转换成datetime
    t=datetime.strptime(t,'%Y-%m-%d %H:%M:%S')
    #datetime添加时区
    utc_dt=t.replace(tzinfo=timezone(timedelta(hours=int(tz[1]))))
    #datetime转换成timestamp
    return utc_dt.timestamp()    

t=to_timestamp('2015-6-1 08:10:30', 'UTC+7:00')
print(t)

2、编写Python程序以选择指定年份的所有星期日

import datetime
a=input('请输入年份:')
def all_sundays(year):
    n=int(a)
    dt1=datetime.date(n,1,1)
    dt2=datetime.date(n,12,31)
    for i in range((dt2-dt1).days+1):
        day=dt1+datetime.timedelta(days=i)
        b=day.isoweekday()
        if b==7:
            print(day)
        else:
            continue       
all_sundays(a)

Day10:文件与文件系统

练习题

1、打开中文字符的文档时,会出现乱码,Python自带的打开文件是否可以指定文字编码?还是只能用相关函数?

  • 参考文章
  • 使用open(path, 'r', encoding = 'utf-8')语句来打开中文字符文档

2、 编写程序查找最长的单词

输入文档: res/test.txt

题目说明:
def longest_word(filename):
    with open(filename, 'r', encoding = 'utf-8') as f:
    	data = f.read().strip().split('\n')   #读取、移除首尾空格、分割每一行
    data1 = ' '.join(data).split(' ')         #连接成一行再按空格分割出单个单词
    data1.sort(key = lambda x:len(x))         #以单词长度排序
    longest = [i for i in data1 if len(i) == len(data1[-1])]  #记录最长的单词
    return longest 

	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,异常处理是非常重要的一部分。当程序运行时如果出现错误,如果没有异常处理,程序就会崩溃。为了避免这种情况,Python提供了异常处理机制。 在Python中,异常处理语句使用 `try` 和 `except` 关键字来实现。`try` 语句块中包含可能会发生异常的代码,如果这段代码出现了异常,则会跳转到 `except` 语句块中执行异常处理代码。 下面是一个简单的例子: ```python try: num = int(input("请输入一个整数:")) print(10/num) except ZeroDivisionError: print("除数不能为0") except ValueError: print("输入的不是整数") ``` 在上面的代码中,我们尝试将用户输入的字符串转换为整数,并将其用作除数计算 10/num。如果用户输入的是 0,则会触发 ZeroDivisionError 异常。如果用户输入的不是整数,则会触发 ValueError 异常。如果发生异常,则会跳转到对应的 except 语句块中执行处理代码。 除了可以指定具体的异常类型,也可以使用 `except Exception` 来捕获所有异常。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) ``` 在上面的代码中,如果发生任何异常,都会跳转到 `except` 语句块中执行处理代码,并将异常信息打印出来。 除了 `try` 和 `except`,还有 `finally` 关键字,它指定的代码块无论是否发生异常都会执行。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) finally: print("程序执行完毕") ``` 在上面的代码中,无论是否发生异常,都会执行 `finally` 中的代码,即输出“程序执行完毕”。 总之,在Python中,异常处理是非常重要的一部分,它可以有效避免程序崩溃,提高程序的健壮性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值