标签:__ .__ 函数 Python self str 魅力 print def
Python基础学习3(函数的魅力)
练习题1
答1
#1.怎么给函数编写文档
'''将注释放在def语句下面,(单引号,双引号,三引号都可以),在通过func.__doc__查看文档'''
def double(a):
'''返回两倍'''
a *= 2
return a
print(double.__doc__)
print(double(2))
#返回两倍
#4
#2.参数和返回值注解
'''代码执行时,注解不会产生任何影响,参数的注解使用:接在参数后面,如果是默认参数,接在参数和=之间,返回值的注解在()外接->,表示注解,可以使用func.__annotations__查看类型'''
def function(test:str,max_len:'int>0'=80) ->str:
test = test + str(max_len)
return test
print(function('adc',10))
print(function.__annotations__)
#adc10
#{'test': <class 'str'>, 'max_len': 'int>0', 'return': <class 'str'>}
#3.改变闭包中对数字,字符串,元祖等不可变元素更新
'''闭包中定义的变量都是局部变量,局部变量改变会报错'''
def make_averager():
count = 0
total = 0
def averager (new_value):
count += 1
total += new_value
return total / count
return averager
avg = make_averager()
avg(10)
#UnboundLocalError: local variable 'count' referenced before assignment
'''使用nonlocal声明变量即可改变'''
def make_averager():
count = 0
total = 0
def averager (new_value):
nonlocal count,total
count += 1
total += new_value
return total / count
return averager
avg = make_averager()
print(avg(10))
#10.0
#4.利用lambda表达式排序
a = [[6,5],[3,7],[2,8]]
a1 = sorted(a,key= lambda x:x[0],reverse=False)
a2 = sorted(a,key= lambda x:x[-1],reverse=True)
print(a1)
print(a2)
#[[2, 8], [3, 7], [6, 5]]
#[[2, 8], [3, 7], [6, 5]]
练习题2
答2
URL=‘https://blog.csdn.net/qq_42659468/article/details/108489761?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162651113416780274120777%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162651113416780274120777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-108489761.first_rank_v2_pc_rank_v29&utm_term=%E6%B1%89%E8%AF%BA%E5%A1%94python&spm=1018.2226.3001.4187’
'''思路:可以看上方的网址链接,讲述十分清楚,本质是递归'''
def Han_Nou_Ta(n:int,i:str,j:str,k:str):
if n == 1:
print(i,'->',k)
return
Han_Nou_Ta(n-1,i,k,j)
Han_Nou_Ta(1,i,j,k)
Han_Nou_Ta(n-1,j,i,k)
Han_Nou_Ta(3,'1','2','3')
#64太多不好看结果,设为3
1 -> 3
1 -> 2
3 -> 2
1 -> 3
2 -> 1
2 -> 3
1 -> 3
练习题3
答3
#1.类属性就是在类中,实例之外定义的属性;实例属性就是在实例中定义的属性
#2.在方式前加上两个__,即可定义私有方法
class Person:
def __name(self):
print('私有方法 ')
#3.myfunc方法中没用指定self参数
class C:
def myfunc(self):
print('hello!')
c = C()
c.myfunc() #hello!
#4.代码如下
class Ticket():
#定义类属性
sale = 100
sale_child = 50
def __init__(self,x,y):
self.x = x
self.y = y
def workday(self):
cost = 100*self.x+50*self.y
print('%d个成人%d个小孩花费%d元' %(self.x,self.y,cost))
def dayoff(self):
cost = (100*self.x+50*self.y)*1.2
print('%d个成人%d个小孩花费%d元' %(self.x,self.y,cost))
t = Ticket(2,1)
t.workday()
#2个成人1个小孩花费250元
练习题4
答4
#1.__new__:__new__ 方法主要是当你继承一些不可变的 class 时(比如 int, str, tuple ), 提供给你一个自定义这些类的实例化过程的途径
#2.__init__:构造器,当一个实例被创建的时候调用的初始化方法
#3.__str__:__str__(self) 的返回结果可读性强。也就是说, __str__ 的意义是得到便于人们阅读的信息。
#4.__rstr__:未找到相应方法
#__repr__(self)相较于__str__的返回结果应更准确。怎么说, __repr__ 存在的目的在于调试,便于开发者使用
#5.__getitem__:__getitem__(self, key) 定义获取容器中元素的行为,相当于 self[key]
#6.__setitem__:__setitem__(self, key, value) 定义设置容器中指定元素的行为,相当于 self[key] = value
练习题5
答5
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)
print(t1+t2)
'''
未开始计时!
提示:请先调用start()开始计时!
计时开始...
计时结束!
共运行了5秒
计时开始...
计时结束!
共运行了7秒
共运行了12秒
'''
练习题6
答6
#1.用all方法,可以查出模块下不带_的方法可以直接调用
import random
print(random.__all__)
#['Random', 'SystemRandom', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
#2.查询Collection模块的基础用法
'''思路:最常见的元素自然就是出现次数最多的元素了,所以需要对每个出现的元素进行计数
Collections模块中的Counter方法 就是计数器
'''
from collections import Counter
language = ['PHP', 'PHP', 'Python', 'PHP', 'Python', 'JS', 'Python', 'Python','PHP', 'Python']
c = Counter(language)
c = c.most_common(1)[0][0]
print(c)
#Python
'''注解:Counter下的most_common([n]),生成Counter对象后,有种情况是键值对太多,我们只在乎出现频率最高的几项,可以使用该方法,参数n代表前n个最常出现的键值对。c.most_common(1)的结果是[('Python', 5)]'''
练习题7
答7
'''思路:重点处理时区的问题,可以使用正则表达式匹配,也可以使用字符串的切片'''
import datetime
def to_timestamp(dt_str:str, tz_str:str):
tz = tz_str.split('C')[1]
tz = tz.split(':')[0]
tz = 0 - int(tz)
time = datetime.datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S') + datetime.timedelta(hours = tz)
time = time.timestamp()
print(time)
to_timestamp('2020-6-1 08:10:30','UTC+5:00')
to_timestamp('2020-6-1 08:10:30','UTC-9:00')
练习题8
答8
'''思路:首先得到每个year的1月1号是周几,再计算第一个周末是几号,再加7循环即可得到所有的周末'''
from datetime import date, timedelta
def all_sundays(year):
dt = date(year, 1, 1) #得到1月1号
dt += timedelta(days = 6 - dt.weekday()) #应该是dt.weekday()+1再用7-
while dt.year == year:
yield dt
dt += timedelta(days = 7)
for s in all_sundays(2021):
print(s)
#2021-01-03
#2021-01-10
#2021-01-17
练习题9
答9
#1.可以指定编码格式,'gbk'中文格式。
f = open('Chinese.txt','r',encoding='gbk')
#2.
def longest_word(filename):
with open(filename, 'r') as infile:
words = infile.read().split()
max_len = len(max(words, key=len))
return [word for word in words if len(word) == max_len]
print(longest_word('res/test.txt'))
格式,'gbk’中文格式。
f = open(‘Chinese.txt’,‘r’,encoding=‘gbk’)
#2.
def longest_word(filename):
with open(filename, ‘r’) as infile:
words = infile.read().split()
max_len = len(max(words, key=len))
return [word for word in words if len(word) == max_len]
print(longest_word(‘res/test.txt’))
标签:__,.__,函数,Python,self,str,魅力,print,def 来源: https://blog.csdn.net/qq_41035372/article/details/118996543
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。