Python'da bir işlevi düzgün tanımlayamıyorum. Biri bana nerede yanlış gittiğimi söyleyebilir mi?

Talimatlar: Aşağıdaki biçimde bir dosya adını temsil eden bir dize alan calc_average adlı bir işlev yazın, örneğin:

Smith 82
Jones 75
Washington 91

İşlev, dosyadaki verilerden sınıf ortalamasını hesaplamalı ve döndürmelidir.

Şimdiye kadar var:

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0

Bu kısmı geçmeye çalıştım, ancak ortalamayı yapmanın doğru yolunu bulamıyorum. Herhangi bir öneri? Sadece işleve ihtiyacım var ve dosya sadece bir örnek.

0
Verilerin dosyada nasıl görüntülendiğine bağlıdır
katma yazar RafaelC, kaynak
Bu girişim tam görünmüyor. İşlev daha var mı?
katma yazar Alex, kaynak
Yanlış gittiğini düşündüren ne? Şimdiye kadar iyi görünüyor, ancak ortalamanın gerçek hesaplamasını ve geri dönüşünü henüz yapmadıysanız.
katma yazar Daniel Roseman, kaynak
Ortalamayı kendiniz nasıl hesaplayacağınızı öğrenerek, buradaki birisinin size cevap vermesinden daha fazlasını öğreneceksiniz. Denemeye devam et. Yardıma ihtiyacınız olursa, bir TA ile konuşun veya profesörünüzün çalışma saatlerine gidin.
katma yazar John Kugelman, kaynak
hiçbir şey vermedin
katma yazar itzMEonTV, kaynak
Dosyaadı.txt'nizin bir örneği olmadan, özellikle yanıtlamak zor. Metindeki her satırın Adı, Tamsayı ise, tüm tam sayıları (bölüm [1]) toplayabilir ve satır sayısına bölün veya bir dizini artırabilir ve buna bölün.
katma yazar Scott, kaynak
Şu ana kadar sahip olduklarım konusunda kendime güvenmiştim, ancak bunu geçemiyorum. Denediğim her şey bu bölümden geçmedi.
katma yazar Maddie, kaynak
Sanırım asıl sormam gereken, ortalamanın kendisini nasıl bulacağım. Clsavg toplamını nasıl bulabilirim. İşim bittiğinde bir şeyleri iade etmem gerektiğini biliyorum.
katma yazar Maddie, kaynak
Dosya adım, tam olarak verilen örnekte Smith 82 ile nasıl biçimlendirildiğine bakar. Her öğretmen için yeni satır ve ardından ad ile numara arasında bir sekme.
katma yazar Maddie, kaynak

7 cevap

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0

Tüm bunlardan sonra, kelimenin tam anlamıyla bir işleve bir şey gönderiyorsunuz, ancak bir şey çıkmasını istemiyorsunuz.

return öğesinin kullanılması, işlevden bir şey almanıza yardımcı olur.

return [variable] is a way to use it.

İşte:

Bu satırı ekle [değişken] kodunuzun sonuna geri dönün, şöyle görünecek şekilde:

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0
    return variable #where you replace variable with 
                    #the thing you want to get out of your function

Bu işlevi çağırmak için (ya da "çalıştır" demeliyim) sadece ismini yazınız, ancak kesinti yapınız.

def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    for line in readlines:
        parts = line.split()
        name = parts[0]
        clsavg = parts[1]
        average = 0
    return variable
calc_average() #<- this calls the function

Parametreler 'de de okumak isteyebilirsiniz:

parametre, fonksiyona geçirilen değerlerdir ve kullanılır.

Örnek:

def test1(number):
    number = number + 1 #this can be written as number += 1 as well
    return number
x = test1(5)

Öncelikle bir number parametresiyle işlevi tanımlarım. Bu, number öğesinin bu işlevde kullanılacağı anlamına gelir. def test1 (sayı) altındaki satırların number değişkenini nasıl kullandığına dikkat edin. işleve sayı olarak iletilen her şey, işlevde sayı olarak kabul edilir.

Sonra, işlevi çağırıyorum ve parametre olarak 5 'u kullanıyorum.

Çağrıldığında, işlev 5 (giriş parametresi olduğundan beri) alır ve number değişkenini 5 olarak saklar (( def test1 (sayı) ) Böylece, fonksiyonun kendisinde number = 5 yazmak gibi.

Daha sonra, dönüş numarası bu numarayı alır (bu durumda 6, sayı = 6 olur) ve tekrar dış koda verir. Dolayısıyla, return 6 demek gibidir.

Şimdi en alt satırına geri dönelim. x = test1 (5) , işlev 6 döndürdüğü için x = 6 olacaktır.

Umarım işlevleri daha iyi anlamanıza yardımcı oldum.

2
katma

Yanlış yaptığınız ilk şey, gönderiminizdeki kaynak kodu kaynak kod olarak işaretlememek. Yazınızın geri kalanında ayrı satırlara koyun ve kaynak kod olarak işaretlemek için editörün üstündeki {} bağlantısını kullanın. O zaman şöyle çıkmalı:

def calc_average(): 
  infile = open("filename.txt", "r") 
  readlines = infile.readlines() 
  for line in readlines: 
    parts = line.split() 
    name = parts[0] 
    clsavg = parts[1] 
    average = 0

Aynısını dosya içeriğinde de yapmalısınız: Her satırda bir adınız ve bir numaranız olduğunu varsayıyorum.

Metninize satır içi bir kod snippet'i koymak istiyorsanız, ör. " foo() işlevi", kodun her iki tarafını da ters çevirin. Tepki vurgusu bir mezar gibi ve bazen metin dosyalarında açılış alıntı karakteri olarak çok yanlış kullanılıyor.

Daha sonra, dosya adı içeren bir dize alan bir işlev yazacaktınız. Ama sen sahipsin

def calc_average(): 
  infile = open("filename.txt", "r") 

Bu hiçbir şey almaz. Peki ya

def calc_average(filename): 
  infile = open(filename, "r") 

Şimdi, fonksiyonunuz ne yapıyor, satırları okumak, onları bir isme ve sayıya bölmek - ama ikisi de hala karakter dizisidir ve sayıyı içeren dizge clsavg değişkenine konur, ve sonra sadece her satır okunduğunda ortalama değişkenini 0 olarak ayarlamak.

Ama ne yapmak istersin? Bence "sınıf ortalaması" deyince, bunlar sınıftaki tüm insanlar, sayıların puanları ve sayıların ortalamasını hesaplamak mı istiyorsunuz? Bu, tüm sayıları toplama ve dosyadaki satır sayısına bölünme anlamına gelir.

Bu yüzden döngü başlamadan önce 0 ONCE olarak bir değişken ayarlamalısınız, ardından bir satır okuduğunuzda, onu sayı değeriyle arttırınız. Clsavg değişkeninin kullanılacak olan olacağını hayal ediyorum. Bu nedenle, parts [1] 'i bir tamsayıya dönüştürmeniz gerekir. Bunun için int() 'ı kullanabilirsiniz. Ardından, + = ile veya x = x + y gibi bir ifadeyle artırmanız gerekir. Daha fazla ayrıntı istiyorsanız google'a sorun. Bu şekilde tüm sayıların toplam değerini oluşturursunuz. Son olarak, döngü bittikten sonra (yalnızca için 'e kadar girintili olan bir satırda anlamına gelir), toplamı satır sayısına bölmeniz gerekir. Bu, readlines öğesindeki öğelerin sayısı olacaktır. len() işlevini google’da tutmalısınız. Bölüm, / operatörünü kullanır. X'i x/y değerine ayarlamak için x/= y 'yi kullanabilirsiniz.

Bu, çok fazla varsayımda bulunuyor: tamsayı ortalaması almak istediğiniz, dosyadaki her satırın adı ve numarası olduğu (boş satır veya yorum yok). Bu arada, float() 'ı kullanabilirsiniz. Daha fazla hassasiyet istiyorsanız int() yerine.

0
katma

Pekala, şuna kısmen bakalım:

calc_average adlı bir işlev yazın

def calc_average():

bir dosya adını temsil eden bir dize alan

Bunu anlamlı bir değişken adı yapalım:

def calc_average(filename):

Şimdi temelleri çözdükten sonra, probleminizi nasıl çözeceğinizi konuşalım:

Dosyanızdaki her satır bir ad ve bir not içerir. Ortalamaları hesaplayabilmeniz için notları takip etmek istersiniz. Yani şunları yapabilmeniz gerekir:

  1. her seferinde bir satır bir dosya oku
  2. bir çizgi ayırın ve ilgili parçayı alın
  3. ilgili parçaların ortalamasını hesaplayın

Dolayısıyla, ilgili kısımları bir listede tutmak yararlı olacaktır. Daha sonra bir sayı listesinin ortalamasını hesaplayan bir işleve ihtiyacımız olacaktı. Öyleyse şunu yazalım

def average(L):
    sum = 0
    for num in L:
        sum += num
    return sum/len(L)

Tabii ki, bunu yazmanın daha kolay bir yolu var:

def average(L):
    return sum(L)/len(L)  # python has a built-in sum function to compute the sum of a list

Artık ortalamayı hesaplamak için bir işleve sahip olduğumuz için, dosyayı okuyalım ve ortalamasını hesaplamak istediğimiz bir sayılar listesi oluşturalım:

def read_from_file(filename):
    answer = []  # a list of all the numbers in the file
    with open(filename) as infile:  # open the file to read
        for line in infile:
            parts = line.split()
            grade = int(parts[-1])  # the integer value of the last entity in that line
            answer.append(grade)
    return answer

Artık ilgili bilgiyi bir dosyadan döndüren bir fonksiyona ve ortalamaları hesaplayan bir fonksiyona sahip olduğumuza göre, ikisini birlikte kullanmak zorundayız:

def calc_average(filename):
    numbers = read_from_file(filename)
    answer = average(numbers)
    return answer

Şimdi, her bir sayıyı takip etmeniz gerekmediğini fark edebilirsiniz, çünkü sadece onları toplar ve sayı sayısına bölersiniz. Yani, bu daha kısa bir şekilde şu şekilde yapılabilir:

def calc_average(filename):
    nums = 0
    total = 0
    with open(filename) as infile:
        for line in infile:
            total += int(line.split()[-1])
            nums += 1
    return total/nums
0
katma

İşlev bir argüman gerektirir. Aynı zamanda ortalamayı da döndürmesi gerekiyor, bu yüzden sonunda bir return ifadesi olmalı.

def calc_average(file_name):
    ...
    return 
0
katma

Ortalamayı hesaplamamışsınız. Ayrıca calc_average işlevinden hiçbir şey döndürmediniz. Bunu deneyin.

def calc_average():
    with open('filename.txt') as text:
        nums = [int(i.split()[1]) for i in text]
        avg = float(sum(nums))/float(len(nums))
        return avg
>>>print(calc_average())
82.6666666667
0
katma
Burada yaptığın şeyi açıklamak yardımcı olacak, çünkü Maddie pitona yeni geldi.
katma yazar Registered User, kaynak

Çoğunlukla kendi kodunuzu ve örneğinizi kullanmaya devam etmek için şunları yapabilirsiniz:

def calc_average(filename):
    infile = open(filename, "r")
    readlines = infile.readlines()
    average = 0 # use this to sum all grades
    index = 0 # keep track of how many records or lines in our txt
    for line in readlines:
        parts = line.split()
        name = parts[0] # basically useless
        # for each line in txt we sum all grades
        average = average + float(parts[1]) # need to convert this string to a float
        index = index + 1
    # divide by the number of entries in your txt file to get the class average
    return average/index

sonra:

calc_average('grades.txt')

baskılar:

82.66666666666667
0
katma
def calc_average():
    infile = open("filename.txt", "r")
    readlines = infile.readlines()
    clsavg = 0
    counter = 0
    for line in readlines:
        parts = line.split()
        clsavg =  clsavg+ float(parts[1])
        counter = counter + 1
    print clsavg/counter
0
katma